托管CLR并以编程方式提供app.config?

时间:2012-03-28 03:09:35

标签: interop c++-cli clr app-config com-interop

我有一个原生的第三方游戏,它允许我通过在本机DLL中导出特定函数来为其编写本机扩展。我一直使用它来使用C ++ / CLI编译器生成的托管代码来托管CLR,允许我从游戏中调用C#代码。这一直很好用,这是一个非常优雅的解决方案。

游戏加载CLR后,它会搜索游戏可执行文件夹中的game.exe.config,以获取更多.NET程序集探测信息:

<?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提供此配置,而不是自己编写完整的CLR托管代码?

2 个答案:

答案 0 :(得分:1)

我最终使用AssemblyResolve事件告诉.NET在哪里可以找到其余的程序集:

    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;
    }

答案 1 :(得分:0)

如何将库项目构建操作中的app.config更改为“Embedded Resource”,然后使用ConfigurationManager.OpenMappedExeConfiguration之类的内容来读取它。