2010-05-05 83 views
6

我有一個基於.net 3.5的dll - 它在內部使用例如Linq,但暴露的API很簡單,沒有花哨的東西。由於C#泛型是在編譯時解決的,我認爲對於主叫方來說,所有它都是API(所有公共部分)。如何將.Net3.5 dll添加到.Net2.0項目中?

但是,當我嘗試從net2.0項目中使用此dll時,我得到的信息,該dll無法引用,因爲dll或其依賴項之一需要更高版本的.net框架。

我可以在目標計算機上安裝任何.net版本(安裝完整個應用程序時),但我無法更改項目本身的.net版本。

那麼:這個怎麼解決?當爲這個項目添加一個C DLL時,我沒有這樣的問題,那麼C#DLL是自包含還是不包含?

回答

9

C#dlls需要運行.Net運行庫,因爲它們不會被編譯爲機器代碼。在這種情況下,dll說它需要Net 3.5,所以你的項目將不得不使用3.5或更高。

要將項目保持爲Net 2.0,您需要構建另一個可執行文件以包含3.5 DLL,並在不同的進程間進行通信。

C DLL的工作原理是將其編譯爲本機代碼,並且不需要.Net框架。 (或至少不版本高於2.0)

+0

+1,很好的答案。另外,我認爲你的意思是3.5 DLL(不是3.2) – Pretzel 2010-05-05 10:27:27

+0

正如我所說的,我可以安裝3.5,沒問題,但我不能爲該項目設置3.5,因爲有人可能會偶然使用3.5個功能。 – greenoldman 2010-05-05 10:32:03

+0

是的,我有固定的現在 - 感謝@Pretzel – Mark 2010-05-05 10:32:05

2

如果您正在使用LINQ to對象,那麼你可以使用LINQ橋: http://www.albahari.com/nutshell/linqbridge.aspx

這是一個LINQ到對象實施.NET 2.0。

您仍然需要使用vs2008進行編譯,但在這種情況下,您可以使用.net 2.0作爲目標平臺進行編譯。 (這是因爲C#3編譯器能夠理解linq子句,即使您以.net 2.0爲目標,它也只是將調用解析爲linqbridge而不是.NET 3.5庫)

1

C#DLL不是自包含的。如果您的3.5 DLL需要LINQ,它依賴於來自3.5(準確地說是3.0)框架的系統程序集,因此整個應用程序依賴於這個版本。

您可以動態加載3.5程序集並使用反射來訪問您需要的功能。當然,這需要一些開銷。

6

我一直在使用System.Core程序和新System.Web.Extensions程序(例如)3.5在ASP.NET 2.0應用程序(使用VS2005)有一段時間了,沒有任何問題。類似於Scott Hanselman博客關於here的博客。所以是的,這是可能的。

.NET 3.5仍然運行在與.NET 2.0相同的CLR上。所以在運行時它都是一樣的。 (假設你已經查明瞭任何依賴關係並將這些3.5 DLL複製到bin文件夾中。)

唯一真正的限制是您可以在開發時使用的C#語言功能。如'var',擴展方法或LINQ查詢語法。

2

如果您使用的是.NET 3.5庫,那麼您的應用程序的要求應該是這樣的,它的任何API的使用者也應該使用.NET 3.5。

就可以繞過這個問題的唯一方法是,如果你包所有的應用程序的依賴與它一起。這意味着你的應用程序使用的庫依賴於.NET 3.0 3.5框架。

但是,我不知道剝開.NET框架的塊,並與一個應用程序打包他們的合法性。在做這樣的事情之前,我會閱讀EULA。海事組織,這是不值得的麻煩;只需安裝3.5,請求用戶安裝3.5並完成它或僅使用2.0功能和庫。至少,如果未來有框架更新,像這樣的黑客攻擊只會讓你更加痛苦的部署。

在這兩種情況下,您的應用將.NET 2.0作爲工作3.0和3.5都在2.0運行時和庫的頂部只是額外庫(克雷格提到的),只要所有的依賴關係的存在。

+0

我一直在想這樣的事情,只是我沒有撕裂任何東西,但我告訴圖書館的要求是什麼。直到現在,我仍然感到驚訝的是,C#庫不是像黑盒子一樣對待,而是其內部「泄漏」。這也意味着C#不適用於插件,因爲即使API是兼容的,在庫中使用更新的.net也意味着重新構建整個應用程序。 – greenoldman 2010-05-06 06:18:11

+1

我認爲你有.NET和C#混淆。該語言與運行時不一樣。此外,沒有**需要**重建一個新的.NET版本庫。如果您正在使用新版本的功能,則只需重新構建**。 – alimbada 2010-05-06 09:59:44

1

沒有什麼漂亮,但有辦法讓快樂地一起工作(按優先順序)的代碼:

1)升級兩個項目3.5

如果我理解正確,那麼你的。 net FW 2.0程序將依賴於3.5庫,這意味着程序的每個功能都可以工作,現在需要FW 3.5。由於您聲明擁有代碼和權限來重新編譯本程序並在部署時安裝任何FW,那麼您可以將其升級到3.5。聽起來很簡單,但由於你沒有這樣做,那麼我想你有很好的理由(像其他程序在呼叫鏈上面,你不能升級到3.5 /重新編譯)。

2)繞過FW2。 0編譯

引用2.0版本庫的時候(或假,只是提供了公共API)構建程序。 分別構建3.5版本的庫,無需程序(因此不需要引用錯誤的FW程序集),並部署3.5版本而不是2.0版本。 由於2.0和3.5使用相同的CLR運行時,所以愚弄編譯器就足夠了。只要部署機器安裝了FW 3.5,一切都應該沒問題。 注意:即使您在部署機器上僅存在.net 2.0,並且用戶不會調用.net 3.5類,一切都很好。如果他這樣做,就會有崩潰;)

3)降級圖書館2.0

,如果你使用.NET FW只有一些類,那麼你可以通過添加那些缺失的未來仍然使用2.0編譯器項目組件。 (這是克雷格共享的Hanselman鏈接的解決方案)。如前所述,你會失去3.5編譯器的語法糖,比如變量。

選擇哪個適合你的情況。