2012-11-19 28 views
2

這是一個姊妹問題以及我的第一個問題Allow C# application built with .NET 2.0 to run on .NET 4.0/4.5。爲了理解,我簡化了我的情況。其實我們的情況有點特別。如何在DLL上使用app.config而不是exe

基本上我們爲我們的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上。我通過使用像我們的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上的app.config而不是在exe上?

回答

1

我的建議是使用蹦牀.EXE來產生.NET DLL的進程外。

msiexec.exe.config不起作用,因爲msiexec.exe具有嵌入式清單。

+0

非常感謝。您可以提供一些更多的細節,或發送一個鏈接爲什麼嵌入式清單會阻止msiexec.exe.config文件的工作?如果可能的話,你能否提供一些關於實現這個蹦牀.exe的更多細節?現在,我們使用自定義操作將.dll保存到磁盤,然後從磁盤動態加載磁帶庫。如果需要,我可以通過與我們的MSI開發人員進行覈對來添加更多細節。 – windfly2006

+0

我們正在考慮在純C++中實現蹦牀.exe,並且dll也不需要C導出函數入口點。 – windfly2006

+0

加載程序在.exe文件中查找清單,如果找不到,則會查找.exe.config文件。蹦牀exe可以以任何你想要的方式實現。這個想法是提取它及其所有依賴項,然後將其作爲自定義操作啓動。 – Joshua

相關問題