2016-02-25 69 views
1

我們有一個包含約90個項目的Visual Studio解決方案。他們中的大多數都是爲DLL文件構建的,有些是用C++編寫的,有些則是用C#編寫的。這些項目通過COM進行通信。我們使用tlbexp來生成一些C#項目(在C++項目中引用的項目)的TLB文件。我們使用tlbimp來生成C++項目的interop DLL。我沒有深入討論這個話題,但我認爲,互操作文件只是定義了C++類的接口,使它們可以從其他項目中使用,對嗎?.NET框架的哪些功能可以互操作程序集引用?

現在,問題如下:爲了將整個解決方案升級到Visual Studio 2015並讓它在.NET 4.6.1上編譯,我使用JetBrains使用dotPeek檢查了生成的程序集。我可以看到,所有C#項目都正確使用.NET 4.6.1,C++ DLL本身是本地的,並且不引用任何.NET。現在,讓我感到意外的是,dotPeek告訴我,互操作DLL(源自C++項目)引用了.NET 4.0。

在嘗試讓.NET 4.6.1和大量研究成爲「精彩」的一天之後,我終於沒有找到任何方式讓interops引用.NET 4.6.1。這甚至有可能嗎?我目前的猜測是,所有生成的interop dll都像這樣引用基本的.NET 4.0,只是因爲它使用與.NET 4.6.1相同的CLR。

是嗎?應該可以在安裝了.NET Framework 4.6.1的任何系統上執行程序集,不是嗎?

回答

4

你正在從dotPeek得到錯誤的信息。它沒有告訴你它是如何計算出.NET版本的目標。它可以是由編譯器生成的.NET程序集。由於它會自動將[TargetFramework] attribute插入到程序集中,因此它會說明在生成項目時選擇了哪個版本的.NET。

但是,互操作程序集並未指定.NET版本,主要是因爲它不是由編譯器生成的。請注意,您在運行Tlbimp.exe時從未指定過某個版本。而不能。 dotPeek可以發現的所有東西都是它的目標是.NET 4,以元數據格式爲指導。沒辦法,它可以更具體。

它並不重要,因爲互操作庫不使用.NET Framework功能。庫的唯一要點是您的程序可以使用COM組件功能。所以dotPeek報告的版本號並不重要;任何.NET 4.x框架都可以使用該庫。

您沒有真正的問題。

相關問題