C++で作成したDLLをラップするDLLを作りたい


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




質問をするときは最低限のマナーとして、開発環境およびターゲット環境（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を埋め込んで利用することができたとしても、おそらく得られるメリットは労力や手間の対価として見合わないはずです。

