この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 219600|答える: 43

[WinForm] .net/c# Costura.fodyを使ってDLLをEXEにパッケージ化してください

[リンクをコピー]
掲載地 2018/04/14 14:41:49 | | | |
Winformやwpfの開発では多くのサードパーティ製DLLが使われますが、パッケージ化するたびにDebugディレクトリ内のファイルを顧客にコピーするか共有する必要があり、使い方があまり便利ではありません。 以前にILMergeやEnigma Virtual Boxなど、dllファイルをマージするソフトをいくつか試しましたが、「Costura.Fody」を知るまでは、世界の方がずっと良いと感じていました~

以下はWinformによって書かれたプログラムで、「HttpHelper.dll」と「Newtonsoft.Json.dll」という2つのDLLを参照しています。プログラムを生成する際には、exeファイルとこの2つのDLLファイルが入り、非常に不快感を覚えます。もしDLLが1つ減ると、下図のように例外を報告することがあります。



以下のリンクは以前の使用例です(推奨されません)

C#はdllをexeのプログラムにパッケージ化します
http://www.itsvse.com/thread-2841-1-1.html
(出典:Architect_Programmer)



Costura.Fodyツールを使えば、元のDLLをターゲットのEXEにマージできます

プロジェクトホームページ:https://github.com/Fody/Costura

使い方、直接Nugetパッケージをインストールする方法:



Costura.fodyを正常に追加すると、ソリューションは自動的にFodyWeavers.xmlファイルを追加します。

解決策を再生成すれば、プログラム生成ディレクトリで成功が確認でき、すべてのDLLが完全にexeに統合され、exeファイルをクライアントに直接コピーして独立して実行できます。 以下に示すように:

1>------ すべての再構築が開始されました:プロジェクト:itsvse、構成:デバッグ 任意のCPU------
1> Fody: Fody(バージョン2.0.0.0)実行中
1> フォディ/コストゥラ:「Costura.dll」に関する言及は見つかりません。 参考文献は修正されていません。
1> フォディ/コストゥラ:埋め込み 'E:\project\itsvse\itsvse\HttpHelper.dll'
1> フォディ/コストゥラ:埋め込み「E:\project\itsvse\itsvse\Newtonsoft.Json.dll」
1> フォディ:609msで終えました。
1> Fody:設定上無効化されているためアセンブリ検証をスキップしました
1> Fody:検証を3msで完了。
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== 全て再生:1人が成功、0が失敗、0==========スキップ





上の画像からもわかるように、生成されたファイルにはNewtonsoft.Json.dll、HttpHelper.dll、Costura.dllは生成されず、2つのファイルのみが生成されており、エラーなしで直接実行itsvse.exe可能です! (PDBファイルは削除可能です。)

ILSpyツールを使ってプログラムをデコンパイルし、下の図のように生成されたソースコードを見ていきましょう。



実装原則の紹介

CLRがアセンブリの読み込みを試みるが読み込めない場合、AppDomain.AssemblyResolveイベントを発生させます。 プログラムはこのイベントを受信し、CLRがロードしようとしているアセンブリをイベントハンドラに返すことで、プログラムは通常通り動作を続けられます。

Fody.Costuraは、プロジェクト構築時にEXEが参照したすべてのDLLをEXEファイルに埋め込みます。 実行中にプログラムがこれらのDLLのいずれかを使用すると(CLRがDLLファイルを見つけられないためAppDomain.AssemblyResolveイベントがトリガーされます)、必要なDLLはEXEファイルの埋め込みリソースから抽出されます。


AttachメソッドはAppDomain.AssemblyResolveイベントを受信しているのがわかります。 CLRがアセンブリのロードに失敗した場合、AssemblyResolveイベントハンドラが実行されます。 AssemblyResolveは、Common.ReadFromEmbeddedResourcesメソッドを通じて、ロードされたアセンブリの埋め込みリソースからターゲットアセンブリを取得し、CLRに戻します。

これを見て、Attachメソッドはいつ実装されたのか疑問に思うかもしれません。

実際、C#言語の場合、CLRは大きな裏技を隠しています。CLRは各モジュール(各アセンブリは1つ以上のモジュールを含む)をロードする前に初期化されたコードを実行することができるのです。 残念ながら、C#言語はこの部分のコードを制御できません。 Fody.CosturaはILコードをEXEアセンブリの内部モジュールの初期化関数に直接注入し、このILコードの部分が実際にAtchメソッドを実行します。 この方法により、EXEアセンブリが読み込まれた後、Attachメソッドを即座に呼び出すことができます。

上記はFody.Costuraの実装原則の簡単な紹介です。


高度な構成

これらの構成はCosturaFodyWeavers.xmlファイルで追加または変更されます。

CreateTemporaryAssemblies
デフォルト:false
これにより、埋め込みファイルをディスクに埋め込み、その後メモリに読み込みます。 これは、物理ファイルからアセンブリを読み込みたい特定の状況で有用です。

IncludeDebugSymbols
デフォルト:trueです
参照アセンブリの.pdbsも埋め込まれているかどうかを制御します。

DisableCompression
デフォルト:false
組み込みアセンブリはデフォルトで圧縮され、ロード時には非圧縮されます。 このオプションで圧縮をオフにできます。
注意:非標準DLLや暗号化DLLを参照する際は、このプロパティを必ずオフにしてください。 そうしないと、実行ファイルが開けなくなる状況になります。 これは私がDSkin.dllを使っていたときに発見されました。

DisableCleanup
デフォルト:false
Costuraの一部として、組み込みコンポーネントはビルドに含まれていません。 このクリーンアップはオフにできます。

LoadAtModuleInit
デフォルト:trueです
Costuraはモジュール初期化の一環としてデフォルトでロードされます。 フラグがその行動を無効化します。 CosturaUtility.Initialize()をどこかで使えるか確認してください。

アセンブリー排除
使い方:ExcludeAssemblies="DLL1|DLL2」
「すべてのコピーローカル参照を埋め込む」というデフォルトアクションから除外するアセンブリ名のリスト。

アセンブリーを含める
使い方:IncludeAssemblies="DLL1|DLL2」
デフォルトのアクション「すべてのコピーローカル参照を埋め込む」に含まれるアセンブリ名のリスト。

Unmanaged32Assemblies&Unmanaged64Assemblies
使い方:Unmanaged32Assemblies="DLL1|DLL2" Unmanaged64Assemblies="DLL1|DLL2」
混合モードアセンブリはマネージドアセンブリと同じ方法でロードすることはできません。 したがって、Costuraがどのコンポーネントが混合モードで、どの環境で読み込むかを識別しやすくするために、それらの名前を一方または両方のリストに含めるべきです。 名前に.exeや.dllを含めないでください。

プリロードオーダー
使用例:PreloadOrder="DLL1|DLL2」
地元の図書館はCosturaによって自動的に読み込み可能です。 ローカルライブラリを含めるには、ライブラリの不安定性に応じてcastura32またはcostura64という組み込みリソースとしてプロジェクトに組み込みます。 あるいは、プリロードされたライブラリの読み込み順を指定することもできます。 ディスクから一時的なコンポーネントを混ぜると、それらもプリロードされています。

CosturaUtility(コストラ・ユーティリティ)
使い方:




CosturaUtilityは、自分のコードでCosturaシステムを手動で初期化できるクラスです。これは主にモジュール初期化プログラムが動作しない場合のためですライブラリやモノなどです。


最後に、本文のソースコードをダウンロードしてください:

観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ答える





先の:ファイルを読み取る際の文字が乱れた場合のStreamReaderソリューション
次に:Hyper-VとVirtualBoxおよびVMware間の競合に対する解決策
掲載地 2018/06/07 9:35:19 |
依存コンポーネントDllをC#のコンパイル済みEXEに統合する方法を試してみてください!

使いやすくなれば、必ず褒めてあげてください! はは、これです。DLLをリソースファイルに追加すれば簡単で実用的です! (理解できません、チュートリアルを考えられます)@小渣渣

 地主| 掲載地 2018/06/06 10:30:42 |
プログラムに署名すると、以下のエラーが表示されます。

1>MSBUILD : error : Fody: 処理されていない例外が発生しました:
1>MSBUILD : error : Exception:
1>MSBUILD: error: StrongNameKeyPairの公開鍵を取得できません。
1>MSBUILD : error : StackTrace:
1>MSBUILD: error: at System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: error: in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: error: in Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition module, Disposable'1 stream, WriterParameters )
1>MSBUILD: error: in Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
1>MSBUILD: error: In InnerWeaver.WriteModule() position C:\projects\fody\FodyIsolated\ModuleWriter.cs: 行番号18
1>MSBUILD: error: In InnerWeaver.Execute() ポジション C:\projects\fody\FodyIsolated\InnerWeaver.cs: 行番号86
1>MSBUILD : error : ソース:
1>MSBUILD : error : mscorlib
1>MSBUILD : error : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : error :
1> フォディ:551msでゴール。


解決策は見つからないようです。記事を参照してください:

https://github.com/Fody/ExtraConstraints/issues/5

https://github.com/Fody/Costura/issues/194


強い名前に頼って安全を確保しましょう。

だから、セキュリティ機能でないものを守るためにわざわざ手間をかけるのは無意味に思えます

 地主| 掲載地 2018/04/17 13:02:12 |
xxhh 2018年4月17日 11:35に投稿
Costura.Fodyを直接NuGetにインストールした後、Windows Media Playeプレーヤーをドラッグして、削除や報告用の内蔵DLLを2つ生成しました...

Windows Media Playerのコントロールはcomのコンポーネントで、「Costura.Fody」が対応しているかはわかりません。

1: 「Costura.Fody」が「com components」をサポートしているか確認すべきです
2: パッケージされている2つのDLLを無視すること。xmlの無視方法については詳細は公式ドキュメントを参照してください。
掲載地 2018/04/17 10:29:52 |
XML構成を見るにはダウンロード
掲載地 2018/04/17 10:33:34 |
オーナーが、動画とDLLをexeプラグインにまとめてみせるかどうか聞きたいそうです
 地主| 掲載地 2018/04/17 11:16:15 |
xxhh 2018年4月17日 10:33に投稿
オーナーが、動画とDLLをexeプラグインにまとめてみせるかどうか聞きたいそうです
...

これで、ビデオプロパティを「Embedded Resources」に設定し、リソースファイルを読み取ることができます。
掲載地 2018/04/17 11:35:51 |
シャオ・ジャオが2018年4月17日11:16に投稿
これで、ビデオプロパティを「Embedded Resources」に設定し、リソースファイルを読み取ることができます。 ...

Costura.Fodyをインストールしてから直接Windows Media Playeプレーヤーをドラッグし、削除やエラー報告用の内蔵DLLを2つ作成しました  
掲載地 2018/04/17 11:57:09 |
XMLの設定はまだ必要ですか?     
掲載地 2018/04/17 17:42:31 |
シャオ・ジャオが2018年4月17日11:16に投稿
これで、ビデオプロパティを「Embedded Resources」に設定し、リソースファイルを読み取ることができます。 ...

大家さんか私か、聞きたいのですが、ビデオを埋め込みリソースに入れたところ、読み取れるのはバイト配列です。それをプレーヤーに入れて直接再生する方法はありますか?(読み取りパスで再生するためにローカルに書き込みたくありません。ビデオは大きなカード以上です)
 地主| 掲載地 2018/04/17 20:52:16 |
xxhh 2018年4月17日 17:42に投稿
大家さんか私か、聞きたいのですが、動画を埋め込みリソースに入れたところ、表示されるのはバイト配列でした。それをプレーヤーに入れて直接再生する方法はありますか?

大きな動画をリソースファイルにするのはおすすめしません。プレイヤーが直接バイトを渡す他の方法があるか確認してみてください[]
掲載地 2018/04/18 8:08:48 |
シャオ・ジャザ 2018年4月17日 20:52 投稿
大きな動画をリソースファイルにすることは推奨されません。プレイヤーが直接バイトを渡す他の方法があるか確認してみてください。

誰も動画の講義を読んで、あなたの良いアイデアを聞こうとはしません
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com