2012-07-14 65 views
2

我在運行時生成程序集(* .dll)。使用CodeDom中執行編譯過程,如下面的帖子建議:在運行時使用CodeDom.CompilerResults生成程序集(.dll)時生成清單

Generating DLL assembly dynamically at run time

我的代碼和彙編生成成功,沒有錯誤。

// load for reflection only 
var _assemblyTempLoad = Assembly.LoadFrom(assembly.FullName); 

以下異常被拋出:

「無法加載文件或程序集nameforassembly.dll'或者一個當我在運行時通過反射嘗試使用此負載生成組件的問題就來了其 依賴關係。該模塊預計將包含一個彙編 清單。「

如何生成清單文件或修復此問題?

我想澄清在運行時產生的裝配,使用下面的代碼:

CompilerResults compilerResult = codeDomProvider.CompileAssemblyFromFile(compilerParameters, Path.Combine(path, sourceCodeFile));` 

預先感謝您

+1

是否有可能文件被損壞或編譯爲錯誤的框架或編譯爲64位,並且您試圖加載到32位進程?如果您嘗試將編譯後的dll添加到項目中,您可能會得到更準確的錯誤(就像測試一樣)。 – sgmoore 2012-07-14 17:02:23

+0

給與你鏈接的相同,你可以通過添加一行來指定平臺,比如parameters.CompilerOptions =「/ platform:anycpu」; – sgmoore 2012-07-17 16:45:41

回答

0

在運行時(即時)創建程序集時,程序集信息或元數據不會自動放入程序集中。使用[Assembly]屬性也是必要的。這樣,過程的最後一步就是將/ platform參數放到編譯器中(謝謝sgmoore)。我可以看到這個使用Redgate反射器。該程序集顯示沒有版本和元數據屬性。像這樣:

streamWriter.WriteLine(string.Format("[assembly: AssemblyTitle(\"{0}\")]", yourassembly.propertyfornamespace.Replace(" ", ""))); 
streamWriter.WriteLine(string.Format("[assembly: AssemblyDescription(\"{0}\")]", yourassembly.propertywithdescription)); 
0

你有沒有試過以下

compilerParameters.CompilerOptions = string.Format("/win32manifest: {0}", manifestFilename); 

如果您已經將CompilerOptions設置爲某個值,只是連接字符串

compilerParameters.CompilerOptions += string.Format(" /win32manifest: {0}", manifestFilename); 

The win32manifest parameter告訴編譯器也生成清單文件。