我有一个原生的第三方游戏,它允许我通过在本机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托管代码?
答案 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之类的内容来读取它。