私がV8.Netに使用するトリックは、次のとおりです。
- 異なるアーキテクチャを切り替えるためのすべての定義を含む新しいC#「プロキシインターフェイス」プロジェクトを作成します。私の場合、プロジェクトの名前は
V8.Net-ProxyInterface
; 例:
public unsafe static class V8NetProxy
{
#if x86
[DllImport("V8_Net_Proxy_x86")]
#elif x64
[DllImport("V8_Net_Proxy_x64")]
#else
[DllImport("V8_Net_Proxy")] // (dummy - NOT USED!)
#endif
public static extern NativeV8EngineProxy* CreateV8EngineProxy(bool enableDebugging, void* debugMessageDispatcher, int debugPort);
これはあなたが参照するプロジェクトです。次の2つを参照しないでください。
さらに2つのプロジェクトを作成して、ライブラリのx64バージョンとx86バージョンを生成します。これは非常に簡単です。コピーアンドペーストし.csproj
て同じフォルダ内のファイルを複製し、名前を変更するだけです。私の場合、プロジェクトファイルの名前がV8.Net-ProxyInterface-x64
andに変更さV8.Net-ProxyInterface-x86
れた後、プロジェクトをソリューションに追加しました。Visual Studioでそれぞれのプロジェクト設定を開き、Assembly Name
名前にx64またはx86が含まれていることを確認します。この時点で、3つのプロジェクトがあります。最初の「プレースホルダー」プロジェクトと2つのアーキテクチャ固有のプロジェクトです。2つの新しいプロジェクトの場合:
a)x64インターフェイスプロジェクトの設定を開き、Build
タブに移動し、上部でを選択All Platforms
して、と入力します。Platform
x64
Conditional compilation symbols
b)x86インターフェイスプロジェクトの設定を開き、Build
タブに移動し、上部でを選択All Platforms
して、と入力します。Platform
x86
Conditional compilation symbols
開いて、それがx64プロジェクトのプラットフォームとして選択され、x86プロジェクトの両方と構成で選択されBuild->Configuration Manager...
ていることを確認します。x64
x86
Debug
Release
2つの新しいインターフェイスプロジェクト(x64およびx86の場合)がホストプロジェクトの同じ場所に出力されることを確認します(プロジェクト設定を参照Build->Output path
)。
最後の魔法:エンジンの静的コンストラクターで、アセンブリリゾルバーにすばやく接続します。
static V8Engine()
{
AppDomain.CurrentDomain.AssemblyResolve += Resolver;
}
このResolver
方法では、現在のプロセスによって示される現在のプラットフォームに基づいてファイルをロードするだけです(注:このコードは簡略化されたバージョンであり、テストされていません)。
var currentExecPath = Assembly.GetExecutingAssembly().Location;
var platform = Environment.Is64BitProcess ? "x64" : "x86";
var filename = "V8.Net.Proxy.Interface." + platform + ".dll"
return Assembly.LoadFrom(Path.Combine(currentExecPath , fileName));
最後に、ソリューションエクスプローラーでホストプロジェクトに移動し、展開しReferences
て、手順1で作成した最初のダミープロジェクトを選択し、右クリックしてプロパティを開き、に設定Copy Local
しfalse
ます。これにより、リゾルバーを使用して実際にロードする関数を特定しながら、P/Invoke関数ごとに1つの名前で開発できます。
アセンブリローダーは必要な場合にのみ実行されることに注意してください。これは(私の場合)エンジンクラスへの最初のアクセス時にCLRシステムによって自動的にトリガーされるだけです。それがどのように変換されるかは、ホストプロジェクトがどのように設計されているかによって異なります。