2014-01-23 2 views
5

У нас есть проект, состоящий из основной библиотеки C++ и оболочек .NET (2.0 и 4.0) с использованием Marshall. Сборка машины имеет ОС Windows 8.1..NET 4.0 сборка, построенная на окнах 8.1, не работает на более низких версиях Windows

Ядро C++ и оболочка .NET 2.0 построены с использованием MSVC 2005 и отлично работают на других машинах с более низкими версиями окон.

.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 будет использовать общий GetFunctionPointerForDelegate() 4.5.1. Поэтому мне пришлось бросить делегату и перекомпилировать, как предложил первый комментарий к OP. –

1

Вы можете указать версию .Net framework, которую вы хотите, чтобы ваше приложение использовалось в окне свойств проекта. На вкладке «Приложение» выберите предпочтительную версию в раскрывающемся списке «Целевая структура». Вы можете узнать больше о таргетинге на определенную версию фрейма на MSDN.

+0

Цель .NET Framework должна быть независимой от версии ОС. – zneak

+0

@zneak: Да. Но .NET framework 4.5 (.1) установлен * поверх * .NET framework 4.0, что вызывает много очень забавных проблем, которые требуют времени для решения: D – Luaan

1

Поскольку я не использую проекты Visual Studio или MSBuild, мне пришлось выяснить, как с этим справиться в командной строке компилятора C#. Это не так сложно, но есть некоторые новые понятия. Сборки .NET в том же каталоге, что и csc.exe, являются «сборками реализации». Если вы хотите скомпилировать определенную версию .NET, вы должны использовать «ссылочные сборки», которые поясняются здесь: ILDasm, mscorlib and System.Runtime decompilation differences depending on the directory

Вы найдете ссылочные сборки в разделе «c: \ program files (x86) \ Reference Assemblies \ Microsoft \ Framework.NET Framework ". В нем есть каталоги для 3.5, 4.0, 4.5 и 4.5.1, на машине с VS.2008 до VS.2013. Чтобы использовать их, вам нужна командная строка, например:

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# не использовать стандартную стандартную библиотеку по умолчанию.

/ссылка сообщает компилятору C#, что он может использовать библиотеку, путь которой следует. Показанная здесь стандартная библиотека для .NET 4.5: проект, в который я попал, использует только стандартную библиотеку, так что это все, что мне нужно.

Смежные вопросы