这是一个姐妹问题以及我的第一个问题Allow C# application built with .NET 2.0 to run on .NET 4.0/4.5。我在那里简化了我的情况以便理解。实际上我们的案子有点特别。
基本上我们为MSI安装程序编写了一个C#DLL(让我们调用E.dll
)。由于我们的MSI安装程序使用旧版本的Windows安装程序,它无法直接使用C#DLL,它只能使用C类型DLL,因此我们使用名为DLLExporter的开源库来生成C导出函数入口端口。 E.dll
是使用.NET 2.0(VS2005)构建的。
正如我提出的第一个问题,我们无法在只安装了.NET 4.0或更高版本的机器上运行我们的安装程序。经过这个优秀论坛的一些努力和帮助,我认为我开始理解这个问题,这里是最终的应用程序配置文件:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v4.0"/>
</startup>
由于这些C导出函数入口点,最终的C#dll被认为是混合模式程序集,所以我需要在.NET 4.0上使用useLegacyV2RuntimeActivationPolicy作为“true”。
但是有一个问题,配置必须在exe上,但不在DLL上。我通过使用测试工具exe证实了这一点,它可以像我们的MSI一样动态加载E.dll
。让我们将测试工具exe调用为T.exe
。因此,通过E.dll.config
上述内容无济于事。我们需要T.exe.config
文件。但是对于我们的MSI安装程序,它是位于C:\windows\system32
的msiexe.exe,我们无法将名为msiexe.exe.config
的文件放入system32(我刚刚测试过它,它不起作用,我仍然需要找出哪个exe应该有app.config文件)。无论哪个exe,都是一团糟。我将无法通过在.NET 4.0(VS2010)中构建DLL来解决此问题,因为我需要配置文件将useLegacyV2RuntimeActivationPolicy设置为“true”。
知道如何在DLL而不是exe上使用app.config吗?
答案 0 :(得分:1)
我的建议是使用trampoline .EXE在进程外生成.NET DLL。
msiexec.exe.config无效,因为msiexec.exe有嵌入式清单。