2012-04-30 71 views
4

我有一個多個程序集C#Excel插件,它通過程序集邊界傳遞嵌入式互操作類型。當我在一個配置爲使用.NET 3.5的Excel進程中運行這個時,一切正常。當我在配置爲使用.NET 4.0的Excel進程中運行這個時,只有在插件程序集自身加載中定義的應用程序邏輯的控件。我想我明白爲什麼,因爲.NET 4.0中嵌入式interop類型的處理髮生了顯着變化,所以它們不能跨越程序集邊界。令我困惑的是,我認爲在.NET 4.0中,CLR的多個實例可以託管在單個Windows進程中。如果我的插件以.NET 3.5爲目標,爲什麼它不能在Excel擁有的.NET 3.5 CLR實例中運行?爲什麼Excel試圖在.NET 4.0中運行我的插件?這不是重寫插件的真正選擇,但它需要爲使用.NET 4.0插件的客戶端進行安裝,因此使用註冊表項或Excel.exe.config文件進行操作並不合適......任何幫助都將非常感謝!我可以在同一個Windows進程中使用CLR的.NET 4.0實例和CLR的.NET 3.5實例嗎?

+0

什麼是您正在使用的VSTO版本? –

+0

我正在使用VSTO 4.0,它支持.NET 4.0和.NET 3.5。我不知道它是否同時支持。 – richardstartin

回答

3

標題中問題的答案是'是'。 .NET運行時版本2.0(即.NET Framework 2.0,3.0和3.5所使用的運行時版本)可以在運行時版本爲4.0的進程中並行運行(這也是版本號由升級的.NET Framework 4.5使用)。

但是,VSTO的情況並非如此簡單,因爲Excel和VSTO運行時間之間存在交互作用以決定要加載的內容。 VSTO 4基本上包含了針對.NET 3.5(.NET 2.0運行時)和.NET 4.0的Office擴展的不同版本。根據您的目標VSTO 4辦公室擴展版本的不同,您可以使用類(與舊VSTO兼容)或主要接口,因此VSTO API設計和代碼也有所不同,具體取決於VSTO 4辦公室擴展版本你用。然後部署和加載VSTO加載項取決於您定位的VSTO Office擴展的哪個版本。

因此,VSTO 4加載項加載的.NET運行時版本與您加載項的外觀相關聯。在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/bb608603(v=vs.100).aspxhttp://msdn.microsoft.com/en-us/library/ee712596.aspx

如果您有其他COM組件,可能是COM組件在不同版本的運行時(例如2.0運行時)中激活,然後無法從基於4.0運行時的加載項訪問。該方法COM互操作類型改變在.NET 4.0中通常會做的事情工作更好,因爲運行時現在可以正確地識別來自不同的組件定義類型爲「持平」的基礎上的GUID等

爲了使生活更輕鬆,我也可以建議Excel-DNA(我開發)。它是一個免費且易於使用的插件庫,用於在不使用VSTO的情況下在.NET中製作全功能的Excel加載項。 Excel-DNA允許您定位任何版本的Excel以及任何2.0+版本的.NET。

+0

在倒數第二段 - 我在這個插件中有一些東西在一個程序集中,有c-tor命令的類Command(MSExcel.Application應用程序)。然後我在我的插件組件類ConcreteCommand,c-tor ConcreteCommand(MSExcel.Application app):base(app)中。我認爲在.NET 4.0之前需要一個PIA來允許這兩個組件共享一個MSExcel.Application的定義。我認爲這些組件並沒有顯示出來,因爲在.NET 4.0中PIA沒有被查看,所以這兩個程序集可能不同意MSExcel。應用程序,即使我 – richardstartin

+0

繼續......兩個程序集可能不同意MSExcel.Application是什麼,我認爲這是PIA所做的 - 它給所有通信程序集COM類型的通用定義。這是一個有缺陷的理解?這可能是因爲我已經(感謝deisgn遺留下來的)嵌入互操作類型作爲通用類型參數在這個插件中穿過程序集,它甚至不會針對.NET 4.0進行編譯。 – richardstartin

+2

在.NET 4中,如果您不選擇「Embed Interop Types」,則將使用PIA作爲.NET 3.5(只有一個MSExcel.Application類型)。如果您編譯了一個庫來引用PIA來將.NET 3.5作爲目標,然後將該庫加載到具有嵌入式interop類型的.NET 4加載項中,則引用的PIA也將被加載,但.NET 4運行時將足夠聰明地認識到類型是「相同的」。 – Govert

0

我不熟悉開發excel插件,但是你可以做到這一點。
但是在同一個過程中使用不同版本的clr是自動完成的。
您可以閱讀詳細信息here