2016-12-13 10 views
2

第三者がアンマネージコードをコンパイル(のx86/x64の分離)とプラットフォームのいずれかのために管理C#.NET DLLを提供する(のx86/x64の分離):2つの管理対象x86/x64 dllを1つの管理対象AnyCpuライブラリに結合する方法はありますか?

  • FooManaged_x86.dll
  • FooManaged_x64.dll

これは私が受け取るものです(ネイティブコードでも管理されていないDLLでもありません)。

次に、x86またはx64のいずれかをターゲットとするC#.NETアプリケーション(またはライブラリ)を作成し、対応する管理対象DLLを直接参照することができます。

私のアプリケーションはAnyCpu(私の目標)をターゲットとすることができ、x64 dll(コンパイラの警告が間違っている)を参照し、x64として実際に動作するときにのみ動作します。ここでも、これは特定のプラットフォームに結びついています。

私は(ボンネットの下にDLLIMPORTやマニュアルAssemblyLoadを使用して)実行時に動的にapproriate DLLをロードすることによって、1つのマネージDLLに(Fody.Costura付き)管理されていないのx86/x64のDLLを組み合わせることができますことを、知っています。私は大きな成功を収めてきましたが、この方法は dllで管理されています。管理されたC#から管理されたC#dllにPInvokeする必要があります。これは間違っています。

Q:管理された2つのx86/x64 dllをPInvokeなしの管理AnyCpu DLLに結合する方法はありますか?

+0

私が知る限り、x86を参照すると、コンパイルされたターゲットがx86とx64の両方で実行できるようになります。私はあなたがAnyCpuだけでなく、あなたのプロジェクトをコンパイルできると思っています - しかし、私は完全にはわかりません。 – gilmishal

+0

@gilmishal:テストされていませんが、多くの点でx86は良いデフォルトです。しかし、私のサードパーティのライブラリは大きなファイル/データセットで動作するので、64ビットは実際の利点を提供します。 –

答えて

3

はい、あります。私はLibZを使用して、混合モードアセンブリをリソースとして管理AnyCPUアセンブリにパッケージングすることに成功しました。ライブラリは、実行されているプラ​​ットフォームの正しいアセンブリを選択します。

これは同じ著者によってlz4netで使用されている技術です。

あなたのケースでは、コマンドラインは次のようになります。

libzを注入し、DLLを--assembly YourAnyCpuLib.dll --include FooManaged.x86.dll --include FooManaged.x64.dll

AnyCPUアセンブリは、依然としてプラットフォーム依存のライブラリの1つを参照する必要があるため、ビルド時に警告が表示されます。テスト/開発目的で使用しているものを選択するだけです。

また、サードパーティのライセンスでは、アセンブリを自分自身に組み込むことを禁じられていないことを確認してください。

+0

私の特定のシナリオでは、依存関係は複雑(静的な管理されていないライブラリを含む)であり、恐ろしい状態です(x86 DLLがまったく動作しないことがわかりました)。 CosturaもLibZも静的なアンマネージドなものをサポートしていません(AssemblyResolveは呼び出されません)。よりシンプルなシナリオでは、これはおそらく動作します。 –

関連する問題