2013-05-12 70 views
0

vs中的我的解決方案結構如下。csharpcodeprovider在將程序集添加到gac時無法編譯

  • MyRuleEngineFramework
  • RulesEditor

MyRuleEngineFramework是一個類庫。 RulesEditor是一個winforms項目。後者引用前者,但是,組件並不在任何地方被編輯器項目使用。

有代碼,就幾行,我做了一種參考的:

CSharpCodeProvider provider = new CSharpCodeProvider(); 
CompilerParameters cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("System.dll"); 
cp.ReferencedAssemblies.Add("MyRuleEngineFramework.dll"); 
cp.OutputAssembly = "temp.dll"; 
cp.GenerateInMemory = false; 
CompilerResults cr = provider.CompileAssemblyFromSource(cp, SourceCode); 

上面的代碼執行的很好,我得到了編譯的程序集的第一次。

然後我將MyRuleEngineFramework.dll註冊到gac。

之後,生成的代碼(SourceCode)沒有編譯。然後我在編輯器項目中刪除了對dll的引用(當程序集仍在Gac中)時,它仍然沒有編譯。

現在爲什麼會發生這種情況?

+0

你是什麼意思,「沒有編譯」?什麼是你收到的錯誤信息? – svick 2013-05-12 11:39:08

回答

2

編譯器需要參考彙編。這不應該存儲在GAC中。 GAC只是爲了幫助CLR找到編譯時使用的任何引用程序集的正確版本。因此編譯器從來沒有在GAC中查找參考程序集。他們也不可能這樣做,他們不知道要尋找什麼版本。

因此,當您將程序集添加到GAC時,出現這種情況。構建系統現在不再將DLL複製到輸出目錄,因爲它可以指出這不再是必需的。所以你的CodeDom代碼不能再工作了,因爲引用程序集丟失,編譯器不能再找到它。

請勿在開發機器上使用GAC。只有在您安裝程序的機器上纔可以。在你的特定情況下,應該是永遠不會的,因爲你依賴於你編譯的程序集,以便與運行代碼時加載的程序集相同。

+0

System.dll存儲在gac中嗎? – deostroll 2013-05-12 15:36:00

+1

這不相關。編譯器使用System.dll的引用程序集,存儲在.NET 4及更高版本的c:\ program files \ reference程序集中。編譯器已經知道如何在那裏找到它。 – 2013-05-12 15:45:40

相關問題