2012-03-28 9 views
2

私はネイティブのサードパーティゲームを持っています。これにより、ネイティブDLL内の特定の関数をエクスポートすることでネイティブエクステンションを書くことができます。私はこれを使ってC++/CLIコンパイラ生成のホスティングコードを使用してCLRをホストし、ゲームからC#コードを呼び出すことができました。これは偉大な作業をしており、それは非常にエレガントなソリューションです。CLRをホストし、プログラムでapp.configを提供していますか?

CLRは、ゲームによってロードされると、それはさらに、.NETアセンブリのプロービングについては、ゲームの実行可能フォルダにgame.exe.configを検索します。これは、任意の設定ファイルは、私のフォルダ構造を壊す

<?xml version="1.0"?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="@Arma2NET"/> 
    </assemblyBinding> 
    </runtime> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration> 

。私は自分のプロジェクトを@Arma2NETフォルダー内に自己完結させ、ランダムな設定ファイルをゲームフォルダーには入れないようにしたいと思います。現時点では、ネイティブのCLRホスティングDLLと同じフォルダにプロジェクトファイルを格納することは、ゲームのフォルダ要件のため不可能です。

CLRをホスティングするコードの全体を自分で書くのではなく、起動時にプログラムからこの設定をネイティブコードから提供する方法はありますか?

答えて

1

私はどこに私のアセンブリの残りの部分を見つけるには、.NETを伝えるために、AssemblyResolveイベントを使用して終了:

Assembly^ ResolveAssembly(Object ^sender, ResolveEventArgs ^e) 
    { 
     String ^directory = Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location); 
     AssemblyName ^assemblyName = gcnew AssemblyName(e->Name); 
     for each (String ^extension in gcnew array<String^> { ".dll", ".exe" }) 
     { 
      String ^fileName = Path::Combine(directory, assemblyName->Name + extension); 
      try 
      { 
       return Assembly::LoadFile(fileName); 
      } 
      catch (...) 
      { 
      } 
     } 
     return nullptr; 
    } 
0

ライブラリプロジェクトビルドアクションのapp.configを "埋め込みリソース"に変更し、次にそれを読むためにConfigurationManager.OpenMappedExeConfigurationのようなものを使用してください。

+0

CLR設定を読ん1になるように、私は、私はこれを行うことができるとは思いません私のプログラムではありません。 – Scott

関連する問題