2009-04-22 51 views
0

我有一個令人討厭的問題,那些曾經工作的東西停止工作。 看看這個代碼:ASP.NET - 如何阻止一個項目中的類/ dll被編譯到另一個項目中

Assembly _abc_assembly = Assembly.LoadFile(「c:\junk\abcabstract\bin\abc.dll」); 

ABC.ContentAttribute attribute; 
attribute = (ABC.ContentAttribute)_abc_assembly.CreateInstance("ABC.TextAttribute"); 

ContentAttribute在DLL中定義。 顯然,這應該工作。你應該能夠將自己的對象投射到自己身上。

但它會產生這個錯誤:

alt text http://www.yart.com.au/stackoverflow/compile1.png

這個bug在這裏http://www.yoda.arachsys.com/csharp/plugin.html討論這是我得到了連這個遠。從這篇文章中,我瞭解到ContentAttribute類不知何故以ABC.DLL 網站項目的DLL結束。

該網站的項目,我有如下:

alt text http://www.yart.com.au/stackoverflow/compile2.png

現在ContentAttribute是不是在這個項目中,它是在DLL ABC.DLL。你可以看到,因爲我已經擴展了每個分支,並且ContentAttribute.cs文件不存在。

然而不知何故,它結束了在網站創建一個重複的參考DLL。 ContentAttribute在某種程度上以ABC.DLL和網站項目的DLL結尾。

誰能告訴我:

一)爲什麼ContentAttribute在兩個dll?我沒有想到在一個項目中強制將該代碼包含到項目DLL中的dll。

b)如何阻止它發生?

順便說一下,我絕對不想將網站項目更改爲網站應用程序,如果我可以避免它。

備註:

刪除臨時ASP.NET文件不起作用。只要我編譯我的網站項目,他們就會重新創建。

alt text http://www.yart.com.au/stackoverflow/compile3.png

回答

0

ABC.DLL通過您的網站引用,併成爲它的一部分(這是在Bin文件夾)。 ASP.NET編譯您的網站,並將ABC.DLL放置在臨時位置(C:\ Windows ... \ Temporary ASP.NET Filse ...)。它被ASP.NET自動加載。您正嘗試從不同位置手動加載ABC.DLL(D:\ junk \ abcabstract \ bin \ abc.dl)。兩個組件不匹配,因此你會得到錯誤。

爲了防止這種情況發生,您必須重新考慮您的插件架構。你能提供更多的信息嗎?

更新: 你爲什麼不解決這個問題是這樣的:

// Assembly _abc_assembly = Assembly.LoadFile(「c:\junk\abcabstract\bin\abc.dll」); 
// ContentAttribute attribute; 
// attribute = (ContentAttribute)_abc_assembly.CreateInstance("ABC.TextAttribute"); 
ContentAttribute attribute = new ContentAttribute(); 
+0

我可以發誓這不是發生在一天前。這裏還沒有真正的架構,這是一個測試項目,我只需要它的工作! – Petras 2009-04-22 23:21:27

+0

爲什麼需要使用完整路徑加載程序集?我添加了無需反射即可創建ContentAttribute實例的代碼。 – 2009-04-22 23:32:52

0

這是一個命名空間衝突。它不知道使用哪個ContentAttribute,因爲它在不同的命名空間/程序集中找到2。

您可能具有不同名稱的DLL的舊副本。刪除您的臨時ASP.Net目錄並重新編譯。

爲了避免將來:爲對象

使用完全合格的名稱,如果你需要得到它的工作。

ABC.ContentAttribute ca = new ABC.ContentAttribute(); 

,或者如果鑄件做同樣的

ABC.ContentAttribute ca =(ABC.ContentAttribute)ca2; 
相關問題