2014-01-23 34 views
5

我們有一個項目,由使用Marshall的C++核心庫和.NET包裝器(2.0和4.0)組成。生成機器具有Windows 8.1操作系統。在Windows 8.1上構建的.NET 4.0程序集在較低版本的Windows上無法正常工作

C++核心和.NET 2.0包裝使用MSVC 2005構建,並且適用於其他Windows版本較低的機器。

.NET 4.0包裝使用Microsoft SDK 7.1構建。圖書館工作構建機器上很好,但在其他機器崩潰(與.NET 4.0安裝)具有以下錯誤:

Exception: System.MissingMethodException: Method not found: 'IntPtr System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(!!0)'. 

好像包裝使用更高版本的.NET建,我不知道如何解決這個。據我所知,沒有辦法強制使用.NET 4.x的特定版本,雖然它們不是向後兼容的。

+2

'GetFunctionPointerForDelegate'的通用版本僅在.NET 4.5.1以後才存在。確保您使用的是通過將您的委託轉換爲接受委託的方式。 – zneak

+0

@zneak謝謝你的回覆。是的,我確定支持的方法被調用。這一個:[MSDN](http://msdn.microsoft.com/ru-ru/library/at4fb09f%28v=vs.110%29.aspx) –

回答

1

我設法解決了這個問題。不知何故,MSBuild使用最好的avilable工具集,雖然環境被配置爲Windows SDK 7.1

在調查問題時,我終於找到了this article。因此,爲了構建項目,我必須將環境配置爲SDK,並告訴MSbuild使用此SDK中的工具集。

所以解決方法是調用MSbuild標誌/p:PlatformToolset=Windows7.1SDK

感謝大家的幫助!

+0

這並不適用於我。我的開發機器安裝了4.5.1,無論我爲PlatformToolset或ToolsVersion添加了什麼,我的C++/CLI代碼都會使用4.5.1的通用GetFunctionPointerForDelegate()。因此,我最終不得不投入到委託並重新編譯,因爲OP的第一條評論建議。 –

1

您可以指定希望您的應用程序在項目屬性窗口中使用的.Net框架的版本。在應用程序選項卡下,在目標框架下拉列表中選擇您的首選版本。您可以在MSDN上看到有關定位特定框架版本的更多信息。

+0

.NET Framework目標應該獨立於操作系統版本。 – zneak

+0

@zneak:是的。但.NET框架4.5(.1)通過* .NET框架4.0安裝*,這導致了很多非常有趣的問題,需要數天解決:D – Luaan

1

因爲我不使用Visual Studio項目或MSBuild的,我必須找出如何在C#編譯器的命令行處理這個。這並不複雜,但有一些新的概念。與csc.exe位於同一目錄中的.NET程序集是「實現程序集」。當你想編譯一個特定的.NET版本,你應該使用「參考彙編」,這裏解釋這裏:ILDasm, mscorlib and System.Runtime decompilation differences depending on the directory

您可以在「c:\ program files(x86)\ Reference Assemblies \ Microsoft \ Framework.NET框架「。在安裝了VS.2008到VS.2013的計算機上,有3.5,4.0,4.5和4.5.1的目錄。要使用它們,您需要一個命令行,如:

csc/target:library/noconfig/nostdlib +/reference:「C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NET Framework \ v4 .5 \ mscorlib.dll「MyLibSrc.cs

/noconfig告訴C#編譯器忽略csc.rsp,它提供了一個默認的引用程序集列表,這是您不需要的實現程序集。

/nostdlib +告訴C#編譯器不要使用它的默認標準庫。

/reference告訴C#編譯器它可以使用路徑名後面的庫。這裏展示的是.NET 4.5的標準庫:我使用標準庫的項目,這是我所需要的。

相關問題