2012-05-02 12 views
6

私はC#プロジェクトから参照しているManaged C++ dllを持っています。 C#プロジェクトはAnyCPUとしてコンパイルされます。 32ビット版と64ビット版のManaged C++ dllをコンパイルし、実行中のC#プロジェクトに実行中のアーキテクチャに応じて正しいものをロードするように指示する方法はありますか?マネージC++とAnyCPU

答えて

3

This articleでは、複雑な方法でこれを行う方法が説明されており、いくつかのアプリケーションに適用されるもっと簡単な方法について説明しているStefanのコメントを参照してください。

1

C++ dll(P/Invoke対.netアセンブリ参照)はどのように参照するのですか?インストール時に.dllの2つのバージョンを入れ替えることができます。

1

AnyCPU dllをC++ dllで再生するというトリックは、実行時にアセンブリがC++ dllをロードしてからAppDomain AssemblyResolveイベントに登録できないことを確認します。アセンブリがdllをロードしようとすると失敗すると、コードはロードする必要のあるdllを判断する機会があります。イベントへの登録

は次のようになります。私はAnyCPUのDLLからC++の機能にアクセスする方法を示す簡単なプロジェクトを作成している

System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args) 
{ 
    string assembly_dll = new AssemblyName(args.Name).Name + ".dll"; 
    string assembly_directory = "Parent directory of the C++ dlls"; 

    Assembly assembly = null; 
    if(Environment.Is64BitProcess) 
    { 
      assembly = Assembly.LoadFrom(assembly_directory + @"\x64\" + assembly_dll); 
    } 
    else 
    { 
      assembly = Assembly.LoadFrom(assembly_directory + @"\x86\" + assembly_dll); 
    } 
    return assembly; 
} 

System.AppDomain.CurrentDomain.AssemblyResolve += Resolver; 

イベントハンドラは次のようになります。

https://github.com/kevin-marshall/Managed.AnyCPU

+0

私はこのコメントに投票していますか? –

+0

私も。私は生産でこれを行うかどうかはわかりませんが、これは少なくとも実行可能なアイデアです。不当を元に戻すために0にアップしました –

+0

ありがとうIvan!私はあなたのサポートに感謝します:) –

関連する問題