目次
2. NPOIをめぐる失敗プロセス(純粋な苦情、スキップ可能)
②. VS が NuGet パッケージ マネージャーを開きます
序文
以前はいつも問題に遭遇していました。オープンソースのライブラリを見つけたものの、それを使用するのが非常に面倒でした。他人がコンパイルした DLL をオンラインで探すのは時間がかかるだけでなく、使えない可能性もあるし、使えても環境が変わると使えなくなる(Unity は複数のプラットフォームでリリースする必要がある場合が多い) )。自分でコンパイルするのは難しく、空のプロジェクトを作成して最初からコードを記述するとコンパイルは成功しますが、既存のプロジェクトから DLL を生成すると常に失敗します。。。
今回、偶然の衝突がついに解決し、この宝物であるナゲットを家に持ち帰ることができました。!ようやく村にも高速道路ができたような気がします…。
1. 開発環境の紹介
1.Unityのバージョン
現在使用されているUnityのバージョンは2022.1.8f1です。
推測: .Net4.x または .NetStandard2.0 以降のバージョンを使用できます。
.net2.0しか使えない下位バージョンに関しては問題があるかもしれませんが、Nugetは.net4から始まったようです。
2. 出版プラットフォーム
現在のプラットフォームは Android で、選択されたプラットフォームは .NetStandard2.1 です。
他のプラットフォームについては、Unity リリース設定の [構成] -> [API 互換性レベル]を参照してください。
Nuget での依存関係の決定は Unity の設定と一致しています (後でスクリーンショットがあり、それらはすべて Nuget にリストされています)。
3. 今回の目標
機能: 携帯電話は NPOI プラグインを使用して単語を動的に生成します(機能は重要ではありません。主なことは dll を抽出することです)。
Core: 実際には、必要な DLL を入手する方法です。そうですね、何か使えるものが欲しいのです!!
2. NPOIをめぐる失敗プロセス(純粋な苦情、スキップ可能)
a. GitHub で NPOI プラグインを見つけたところ、ソース コードに dll がなく、.NET Framework 7.2 が存在しないことがわかり、開けず断念しました。
b. 他の人がコンパイルした DLL を初めて見つけたときは、それをインポートし、エラーを直接報告します。
c. コンパイルされた NPOI を Nuget から抽出しますが、インポート エラーが報告され、ICSharpCode.SharpZipLib が見つかりません。このライブラリもネットで探したのですが、インポート後のバージョンが違っていて、元のプロジェクトはGithubにあったのですが、コンパイルする必要があり、まだNPOIが完成していないのではないかと思い、諦めることにしました。
d. N 回目で、他の人の DLL 番号を見つけましたが、それは機能しました。!!
① コンパイラは動作し、リリース時にエラーも報告されませんでした。本当にうれしいです。この機能は近々開発される予定のようです。
② 問題が発生します。コンパイラによって生成された単語は正常に開くことができ、正しい形式になっていますが、apk がリリースされるとすべて文字化けしてしまいます。。。私の心の最初の反応は、不正な WPS が私の携帯電話に Office を誤ってダウンロードしたということでした (コンピューターは Office 2019、携帯電話は WPS です。この反応はごく普通のことであり、軽蔑的なものではありません)。。。。しかし、私はあまりにも世間知らずで、問題の深刻さを理解していませんでした。。。コンパイラで生成した単語は携帯電話では開けるのに、携帯電話で生成した単語がパソコンでは開けないとき、それはofficeやwpsの問題ではないことに気付きました。 , 携帯電話側で別途何か設定が必要なのかも知れないと思って、あまり真剣に考えていませんでした。。。フォント、エンコード、スタイルなどを変更しても問題が変わらない場合や、コードが 1 行の英語しか生成されず、開くと依然として文字化けしている場合、それは本当に不正行為であることがわかります。。。次に、Unity エンジンの設定とプロジェクトの設定を確認しますが、問題は残ります。。。他に方法はないので、別の方法を試してください。新しいテンプレートを作成し、それをコードで開き、キーワードを置き換えます。これにより、書式設定の問題を心配する必要がなくなります。。。キーワードの置換の期待が実際の状況と一致しないことがわかったとき、私は本当に混乱しました。置換は成功しましたが、成功しませんでした。成功はキーワードが実際に置き換えられたためですが、失敗は置き換えられた単語が間違っているためです。コードでは「ACCC」の「A」が「B」に置き換えられ、出力結果は「BCCC」になるはずですが、実際には次のように出力されます。 「DCC」。。。。ブレークポイントを追加した後、プラグイン関数の関数が間違っていることがわかりました: tempText = tempText.Replace("A", "B");。。。。衝撃的: 関数 function は関数名と連結できる! ショック: Unity はエラーを報告しませんでした。!ショック: 役割の皮をかぶって、自分たちのことをやっているのです! !!
③ 推測: 長い間沈黙していたのですが、DLL のバージョンが Unity と一致していないような気がします。DLL は .NETFramework でコンパイルされており、Unity Android は .NETStandard2.1 を使用しています。
e. Unity では .NETStandard2.1 を .NETFramework に置き換えることができますが、何かを変更する必要があるようです。他のすべてのモジュールに影響を与えるため、これは実行しませんでした。
f. 既製の .NETStandard2.1 が見つからないため、自分でコンパイルしてみてください。
① .NET Framework 7.2~8がインストールされています、いずれ使用します~
②プロジェクトは開けますが、コンパイルが出来ません。。。記憶とオンラインチュートリアルによると、それらはすべて失敗しました。
③ふと思ったのですが、手順cで足りないライブラリもNugetから抽出したら成功するでしょうか?その結果、予期しない失敗が発生します。
重大度コード 説明 プロジェクト ファイル行の抑制ステータス エラー パッケージ 'SharpZipLib 1.4.2' をインストールできません。このパッケージを「native,Version=v0.0」をターゲットとするプロジェクトにインストールしようとしていますが、パッケージにはフレームワークと互換性のあるアセンブリ参照またはコンテンツ ファイルが含まれていません。詳細については、パッケージの作成者にお問い合わせください。この問題の解決策は、以下の問題の概要にあります。
④ Unity フォーラム、Baidu、Google を検索しましたが、それでもコンパイルに失敗し、Nuget の抽出に失敗することがわかりました。
⑤ふと気づいた:実はc++を使ってc#をコンパイルしていました。。。(実は以前から疑問に思っていましたが、C# テンプレートが見つからず、普遍的なものだと思っていました)
⑥ C# 開発環境をインストールした後、C# テンプレートを見つけ、最後に Nuget を使用してクラス ライブラリを抽出することに成功します。。。しかし、使用するとまだエラーが発生します。
⑦ 長い間痛みに沈んでいた後、落ち着いて Nuget を開いて注意深く勉強しました (以前はいつもチュートリアルに従い、何も考えずに指示を聞いていました) 突然、アイデアがひらめきました: 依存関係テーブルを比較してみます。彼が望むものはすべて Nuget から抽出します。何ですか? すべての依存関係を抽出するだけです。(ドラマがある気がする)
⑧ 13 個のクラス ライブラリをすべて抽出しました (Excel を作成しましたが、整理すればするほど医師として使用できなくなりました)。
⑨ Unity を 1 つずつインポートし、動作することを確認します。これで私は幸せになれると思いますか?私はそんなに世間知らずなのでしょうか?? 実戦で試していないのに成功と言えるのでしょうか?? ? 案の定、APK の公開に失敗しました。
ArgumentException: アセンブリ System.Security.Cryptography.Xml は NPOI.OOXML ('Assets/Office/Plugins/NPOI.OOXML.dll') によって参照されていますが、dll を含めることが許可されていないか、見つかりませんでした。この問題解決策については、以下の問題の概要を参照してください。
⑩ 依存関係リストに System.Security.Cryptography.Xml がありませんが、NPOI XML ファイルに問題があるのでしょうか?すべての DLL の XML を削除しても問題は残りますが、結局のところ、XML は単なるコメントです。
⑪ 私はNPOIとSharpZipLibに2.1を使用し、他の人は2.0を使用しているため、.NETStandard2.1は.NETStandard2.0と互換性がないのではないかと思われますが、問題が解決していないだけでなく、新たなエラーが発生していることがわかりましたので、思い切って元に戻しました。
⑫ 何度も試みて無駄だった後、突然思いつき、nuget にアクセスしてこれを抽出しました。依存関係リストにあるかどうかに関係なく、作成者がそれを見逃していたらどうなるでしょうか? そして、そこにあります。。。!!!~\(≧▽≦)/~
3. 正しい手順を記録します。
1. 環境を準備する
目的: このステップは、VS を使用して Nuget でパッケージを抽出することです。
プレフィックス:
a. 私は VS2019 を使用していますが、Unity と一致する限り他のバージョンでも問題ありません。
b. 以下の図に示すように、VS には C# 開発環境が装備されています。
ステップ:
①.C#クラスライブラリを作成・開く
C# クラス ライブラリを作成し、パッケージを抽出する準備をします (すでにプロジェクトがある場合にもそれを使用できます。これは単なるツールクラスです)。
注: VS プロジェクトを作成するときは、C# テンプレートを選択します。C# テンプレートが見つからず、DLL または C++ を使用しなければならなかったときのような考えはやめてください。
②. VS が NuGet パッケージ マネージャーを開きます
2. パッケージと依存関係を整理する
目的: ダウンロードする必要があるすべてのパッケージを検索し、ダウンロードの準備をします。
注: 間違ったバージョンをダウンロードしたり、バージョンを混乱させたりするのを防ぐために、ダウンロードせずに並べ替えるだけにしてください。
ステップ:
①.Nuget検索プラグイン
画像の説明: 左上隅で参照 -> パッケージ名を検索 -> パッケージを選択 -> 中央にバージョンと依存関係を表示 -> 右側にダウンロードしたパッケージがあります (最初は無視してください)
ウィンドウが見つからない場合は、レイアウトを直接リセットします: ツールバー「ウィンドウ」 -> ウィンドウのレイアウトをリセット
②. 依存関係を表示する
写真では.NetStandard2.1を使用していますが、状況に応じて選択してください。(上記の「2. リリース プラットフォーム」セクションで説明)
バージョンが異なれば依存関係も異なります (上位バージョンにはより多くの依存関係があるため、バージョンを適切にダウングレードできます)
③. 依存関係を整理する
下の図は、EXCEL を使用して整理した NPOI のすべての依存パッケージを示しています。VS のスクリーンショットに含まれているいくつかのバージョンにラベルを付けるのを忘れていました。
私の観察では、バージョン 4.5.0 の方が適していると思いますが、実際の状況が優先されます。O(∩_∩)O
注: このステップでは、まず、すべての依存関係が Nuget から見つかること、およびすべての依存パッケージのバージョンが一貫していることを確認します。
(ハズレの可能性は低いですが、もしも…)
3. Unityをダウンロードしてインポートする
①. すべてのパッケージをダウンロードする
ヒント: 上記で整理した Excel では、後ろから前にダウンロードします。VS の右上にインストール済みパッケージのバージョン紹介があります。依存パッケージについては、ダウンロード前にインストール済みパッケージと照合できます。
②. パッケージの解凍
VS がインストールされたパッケージで右クリックし、ファイル エクスプローラーでフォルダーを開きます
DLL は lib フォルダーの下にあります。必要なバージョンを選択するだけです。
③.Unityへインポート
Unity の Plugins フォルダーにドラッグ アンド ドロップするだけです。ダウンロード後、一緒にインポートすることをお勧めします。
マルチプラットフォームでは、プラグイン -> Android -> xxx.dll などのサブプラットフォーム フォルダーを作成する必要があります。
4. まとめ
1. この方法は実行可能ですが、多くの依存関係をインポートするため、プロジェクトが大きくなります。私のプロジェクトによってリリースされた APK は以前よりも 3M 大きくなっています...わかりました、受け入れます~~
2. バージョンを 1 つずつ比較するのは、多数の依存関係があり、比較的面倒です。。。
3. NuGet には .Net2.0 パッケージがないようなので、この方法は古いバージョンの Unity には適していません。
4. NuGet には .Net4.x および .NetStandard2.0 以降のバージョンのライブラリがあり、Unity の以降のバージョンでも使用できるはずです。
5. 以前、NuGet は使えるという人もいれば、使えないという人もいます。その理由は、Newtonsoft.Json などの一部のライブラリには依存関係がないためです。
6. 実はとても簡単なのですが、この道を歩いたことがないので少し躊躇しています。
5. 課題のまとめ
問題 1: NuGet インストール パッケージが失敗する
エラー:重大度コード 説明 プロジェクト ファイル行の抑制ステータス エラー パッケージ 'SharpZipLib 1.4.2' をインストールできません。このパッケージを「native,Version=v0.0」をターゲットとするプロジェクトにインストールしようとしていますが、パッケージにはフレームワークと互換性のあるアセンブリ参照またはコンテンツ ファイルが含まれていません。詳細については、パッケージの作成者にお問い合わせください。
理由:プロジェクトは C++ で、インストール パッケージは C# であり、同じ開発言語ではありません。
解決策:インストール パッケージの言語でプロジェクトを作成します。ここでは C# を使用してプロジェクトを作成します。
問題 2: APK の公開に失敗する
注: ArgumentException: Assembly System.Security.Cryptography.Xml は NPOI.OOXML ('Assets/Office/Plugins/NPOI.OOXML.dll') によって参照されています。ただし、dll を含めることが許可されていないか、dll が見つかりませんでした。
理由:依存関係が欠如しているため、依存関係テーブルを整理した人がそれを見逃した可能性があります。
解決策: Nuget に移動して、この依存パッケージを見つけます (このパッケージの依存関係を再帰することを忘れないでください O(∩_∩)O: 依存関係は私の依存関係でもあります)
問題 3: 間違った依存関係または一貫性のないバージョン
エラー:プラグインの .NetStandard バージョンを切り替えた後にエラーが発生しました。たとえば、以前のテストを 2.1 から 2.0 にダウングレードした後に新しいエラーが発生しました。
理由:バージョンが異なると依存関係も異なります。
解決策: Nuget に移動して、置き換えられたバージョンの依存関係を確認し、それらを 1 つずつ追加します。
6. ダウンロードリンク
NetStandard2_1 バージョンの library.zip
抽出コードの NPOI プラグイン: CLPS