2010-11-16 57 views
0

我正在爲用戶提供動態編譯C#代碼的c#codedom項目。 我在添加wpf的程序集dll時遇到了錯誤(對於winforms它工作正常)。當我嘗試添加像「System.Windows.Media」這樣的引用時,它說「在程序集中找不到####。是否缺少一些引用」。但是當我通過它的dll路徑添加引用時,如「C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll」,那麼它就會說「File C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll not found「,但是當我將System.Printing.dll放到應用程序可執行文件夾時,它工作正常。從C#codedom編譯參數中的dll中添加程序集的錯誤

以下是我使用添加引用編譯器選項的代碼:

CompilerParameters oParameters; 
: 
: 
: 
string lcAssemblyDll="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll"; 
oParameters.ReferencedAssemblies.Add(lcAssemblyDll); 

我無法理解的問題。還有沒有其他的方法來添加wpf程序集?

感謝

回答

1

好了,我不能提供一個完整的答案了我的頭頂部,但首先你需要認識到,編譯引用是不一樣的是能夠在解決組裝應用執行。所以如果在應用程序執行過程中出現這個錯誤,我可以想象它會拋出typeloader異常。

其次,您可能正在「無法在程序集中找到####。您是否缺少一些引用」,因爲您所依賴的類的基類型駐留在System.Windows.Media所引用的程序集中。

你可以試着解決這個問題,在Assembly.ReflectionOnlyLoad期間加載你想要引用的程序集的引用。 如果爲AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve添加事件處理程序,則可以添加確保可以加載這些程序集的代碼,然後只添加對CodeCompileUnit的引用。

我遇到了一個問題,雖然這是一些引用在編譯過程中得到了優化,所以我實現了一個討厭的hack,它簡單地向CodeCompileUnit添加了一個容器類,它初始化了每個中找到的第一個可構造類型那些組件。

希望能有所幫助。

+0

謝謝!但是我正在創建一個新的AppDomain來即時編譯代碼。此外,放置在應用程序目錄中的程序集也可以毫無問題地加載。當我嘗試添加放置在其他位置的組件時,問題即將到來。 – 2010-11-16 08:08:30