我有一個多個程序集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實例嗎?
回答
標題中問題的答案是'是'。 .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).aspx和http://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。
在倒數第二段 - 我在這個插件中有一些東西在一個程序集中,有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
繼續......兩個程序集可能不同意MSExcel.Application是什麼,我認爲這是PIA所做的 - 它給所有通信程序集COM類型的通用定義。這是一個有缺陷的理解?這可能是因爲我已經(感謝deisgn遺留下來的)嵌入互操作類型作爲通用類型參數在這個插件中穿過程序集,它甚至不會針對.NET 4.0進行編譯。 – richardstartin
在.NET 4中,如果您不選擇「Embed Interop Types」,則將使用PIA作爲.NET 3.5(只有一個MSExcel.Application類型)。如果您編譯了一個庫來引用PIA來將.NET 3.5作爲目標,然後將該庫加載到具有嵌入式interop類型的.NET 4加載項中,則引用的PIA也將被加載,但.NET 4運行時將足夠聰明地認識到類型是「相同的」。 – Govert
我不熟悉開發excel插件,但是你可以做到這一點。
但是在同一個過程中使用不同版本的clr是自動完成的。
您可以閱讀詳細信息here。
- 1. SQL CLR和.NET 4.0
- 2. 調用.NET類實例的CLR存儲過程
- 3. MongoDB的單一實例可以同時用於.NET和PHP嗎?
- 4. 在SQL Server 2005 CLR UDF中使用.NET 4.0類CLR UDF
- 5. x86和x64有不同的.net CLR嗎?
- 6. VC++ .Net Clr/Safe和Clr/Pure
- 7. CLR調試器爲.Net 4.0
- 8. 我可以在4.0應用程序中引用.NET 3.5 .DLL嗎?
- 9. 你可以在Windows服務器上運行多個clr實例嗎?
- 10. 運行.NET 3.5的代碼在2.0 CLR
- 11. .NET 4.0程序集可以用於.Net 3.5應用程序嗎?
- 12. 用於.NET 4.0的獨立.NET CLR調試器?
- 13. CLR正在運行多少個實例?
- 14. .NET DLL和線程/不同的實例
- 15. 是否有.NET 4.0的CLR分析器?
- 16. mscorlib.dll中在.NET CLR
- 17. CLR 2.0和CLR 4.0之間的區別
- 18. 如何在同一個進程中加載兩個.NET CLR進行對話?
- 19. 如何使用.NET CLR
- 20. 相同/不同CLR上的線程池實例
- 21. 如果我已安裝.NET 4.0,可以安裝.NET 3.5嗎?
- 22. 爲CLR 2.0和4.0 CLR編程
- 23. 「CLR」與「.NET運行時」相同嗎?
- 24. Binary Heap vs(new)B-Heap:應該在CLR/.NET中實現嗎?
- 25. .NET CLR InternalCall
- 26. 您可以在3.5項目中使用.NET 4.0 dll嗎?
- 27. C++ CLR加載.net 4.0 dll當.net 4.0未安裝
- 28. .NET 4.5 RC Framework CLR - Windows XP兼容性
- 29. 實現一個面向3.5和4.0的.Net項目
- 30. 我可以編程實例化一個指定的LocalDb實例嗎?
什麼是您正在使用的VSTO版本? –
我正在使用VSTO 4.0,它支持.NET 4.0和.NET 3.5。我不知道它是否同時支持。 – richardstartin