Создание управляемой оболочки для неуправляемого DLL на 64 бита и на 32 бита

Мы создаем обертку C# вокруг неуправляемого DLL. Неуправляемый DLL прибывает в обоих версии на 32 и 64 бита. Мы сохраняем управляемую оболочку в ее собственном проекте так, чтобы мы могли создать ее как отдельный компонент и снова использовать ее через решения.

Однако это приводит к некоторым проблемам. Так как неуправляемый DLL имеет то же название и версий на 64 бита и на 32 бита, мы испытываем затруднения при перемещении корректного неуправляемого DLL в вывод (мусорное ведро) каталог. Если конфигурация сборки является x86, мы хотим скопировать версию на 32 бита и с x64 64 бита. Со всего одной архитектурой процессора этого легко достигнуть. Мы просто включаем неуправляемый DLL в наш проект и устанавливаем копию, локальную для истинного на файле. Но так как мы должны быть нацелены на обоих его более хитрое.

Мы нашли эту ссылку, Предназначающуюся и для 32 битов и для 64 битов с Visual Studio в том же решении/проекте, но это, кажется, ссылается на некоторый DLL, которые уже существуют на машине. Мы хотим, чтобы правильная версия DLL была скопирована в выходной каталог (мусорное ведро).

Любые подсказки или методы о том, как решить это, являются больше, чем приветствие.

6
задан 6 revs, 3 users 44% 23 May 2017 в 12:30
поделиться

5 ответов

Если вы устанавливаете свою конфигурацию иметь две платформы, один для версий на 64 бита и на 32 бита. Затем вы устанавливаете ссылку для каждой из платформ к корректной dll версии затем все, что необходимо сделать, установлен копия, локальный флаг на ссылочных свойствах и vsts обработает все это для вас. Никакой беспорядок никакая суета.

0
ответ дан 16 December 2019 в 21:40
поделиться

Вы можете захотеть посмотреть что-то вроде MSBuild, чтобы управлять своими сборками в этом случае. Тогда у вас может быть флаг компиляции, который вы используете для выполнения 32 или 64-битных компиляций. Делая это, это также позволит вам контролировать, какой dll вы нажимаете. Это звучит как ваш лучший вариант. Если вам не нравится MSBuild, вы также можете использовать NANT.

1
ответ дан 16 December 2019 в 21:40
поделиться

Мы имеем дело с этим все время с нашими проектами.

У нас есть неуправляемая C ++ DLL, которая имеет 32- и 64-битные версии и проект C #, который использует P / Invoke, чтобы позвонить в неуправляемую DLL.

Для DLL C ++, это целевой путь:

$ (PlatformName) \ $ (ConfigurationName) \ $ targetname)

Так что 32-битная сборка выпуска будет работать в Win32 \ Release, а 64- BIT DEBUG BUILD будет идти в X64 \ Debug.

В проекте C # мы удаляем конфигурацию любой CPU и замените ее новой конфигурацией «X86» и конфигурацией «X64». Его выходные данные аналогичны неуправляемым C ++ DLL, за исключением того, что компилятор .NET использует «X86», тогда как C ++ использует «win32» для обозначения 32-битной архитектуры исполняемого файла.

На шаге после сборки для проекта C # мы копируем соответствующую неуправляемую DLL в целевой каталог для исполняемого файла C #. Поскольку каждая архитектура и каждая конфигурация проекта C # имеет отдельный выходной каталог, нет проблем, поддерживающих, какая архитектура неуправляемой DLL, в которой выходной каталог; Они всегда совпадают.

Чтобы упростить это дальше, я предлагаю вам исследовать постройку многофагулярной сборки ( http://msdn.microsoft.com/en-us/library/226t7yxe.aspx ), поэтому ваша неуправляемая DLL и ее C # Wrapper может проживать в одном уровне монтажа .NET, сохраняя вашу проблему копирования ее вообще.

1
ответ дан 16 December 2019 в 21:40
поделиться

Один другой вариант будет создать новую конфигурацию в Visual Studio, помимо отладки и выпуска .... возможно debug32 и Debug64 и т. Д. Один из настроек конфигурации - архитектура CPU.

Затем в событиях после сборки вашего проекта вы можете сделать старомодный оператор, если / elood, используя макрос имени платформы в качестве условия ...

или если вы использовали имя платформы в качестве подкаталога в вашем решении, где Неуправляемая DLL была сохранена, вы можете скопировать из каталога, используя имя платформы в каталог BIN.

1
ответ дан 16 December 2019 в 21:40
поделиться

Я только что прошел через эту же проблему с помощью обертки .NET для библиотеки FreeImage. То, что я сделал, было создание двух конфигураций сборки, один для X86 и один для X64 для проекта, который ссылается на управляемую обертку. Я добавил MSBUILD Условные разделы копирования в целевой целевой цели в файле проекта, как так:

  <Target Name="AfterBuild">
    <Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" />
    <Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" />
  </Target>
5
ответ дан 16 December 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: