

WindowsOSで使用するC++で作成したDLLを埋め込んだC#のラッパーDLLを作成したいと考えています。  
できればひとつのDLLとしてまとめたいのですが、このようなことは可能ですか？


CC BY-SA 4.0
2018-05-23T07:28:50.063
44185
2018-05-30T18:30:53.720
28634
question
c# c++ windows
C++で作成したDLLをラップするDLLを作りたい


PE32 DLL 要するに unmanage DLL (C++) と  
.NET Assembly DLL 要するに manage DLL (C#) と  
ではファイルフォーマットも違いますし１つにできると聞いた事ないです。できないと明示している資料は見つけていませんし悪魔の証明になっちゃいますが。

仮にできたとしても  
\- manage つまり .NET Assembly のほうは AnyCPU で 32/64bit 共通にできるのに  
\- unmanage のほうは PE32 (32bit) と PE32+ (64bit) で別ものですし  
32bit/64bit 両方対応するためにはやはりファイルを２つ用意しないといけなくてあまりおいしくないんぢゃないかなと思います。

１つにまとめたい理由が配布、つまりファイル２つをコピーしたくないと言う理由であるなら、生ファイルを配布するのでなくインストーラにお任せするのが一番簡単ですし、そっち方向に舵を切ったほうが建設的でしょう。オイラならそうする。

ClickOnce でなんとかできるならそれもありかと・・・


CC BY-SA 4.0
2018-05-29T07:45:38.647
44359
2018-05-29T07:45:38.647
8589
44185
answer


質問をするときは最低限のマナーとして、開発環境およびターゲット環境（OS、IDE、.NET
Frameworkのバージョン、プロジェクト種別など）に関する情報を詳しく記載するようにしてください。

ひとくちに「C++で作成したDLL」と言っても、様々な実装手法があります。

  * ネイティブDLLにエクスポートされたC言語関数形式のインターフェイスを、C#マネージコードから[P/Invoke](https://msdn.microsoft.com/ja-jp/library/fzhhdwae\(v=vs.100\).aspx) (DllImport) で利用していますか？
  * それともC++/CLIでマネージインターフェイスを作成して公開していますか？
  * それともC++/CXでWindows Runtimeインターフェイスを作成して公開していますか？
  * あるいはCOM相互運用ですか？

いずれにせよ、（C/C++などで書かれた）ネイティブDLLを、単にC#（.NET言語）から利用するというだけであれば、わざわざマネージアセンブリに埋め込んでラップする必要はありません。DLL参照を解決できる場所（たとえばEXEと同じフォルダー階層など）にDLLを配置すれば、ローダーが探してくれます。

なお、ネイティブDLL（アンマネージDLL）をリソースとしてマネージアセンブリに埋め込み、DllImport属性で指定する方法自体はあるとされています。  
[DllImportAttribute Constructor (String) (System.Runtime.InteropServices) -
MSDN](https://msdn.microsoft.com/en-
us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx)

ただし、うまく動作しないという事例報告もあります。  
[Embedding unmanaged dll into a managed C# dll - Stack
Overflow](https://stackoverflow.com/questions/666799/embedding-unmanaged-dll-
into-a-managed-c-sharp-dll)

マネージコードの場合はアセンブリの数を減らすことがオーバーヘッドの削減につながるため、複数のアセンブリをまとめるというユースケースは考慮されており、ILMergeというツールが用意されています（ただしマージ対象のすべてがマネージアセンブリである必要があります）。

一方で、仮にマネージアセンブリにネイティブDLLを埋め込んで利用することができたとしても、おそらく得られるメリットは労力や手間の対価として見合わないはずです。


CC BY-SA 4.0
2018-05-29T17:06:02.910
44379
2018-05-30T18:30:53.720
2018-05-30T18:30:53.720
15413
15413
44185
answer