Мы создаем обертку C# вокруг неуправляемого DLL. Неуправляемый DLL прибывает в обоих версии на 32 и 64 бита. Мы сохраняем управляемую оболочку в ее собственном проекте так, чтобы мы могли создать ее как отдельный компонент и снова использовать ее через решения.
Однако это приводит к некоторым проблемам. Так как неуправляемый DLL имеет то же название и версий на 64 бита и на 32 бита, мы испытываем затруднения при перемещении корректного неуправляемого DLL в вывод (мусорное ведро) каталог. Если конфигурация сборки является x86, мы хотим скопировать версию на 32 бита и с x64 64 бита. Со всего одной архитектурой процессора этого легко достигнуть. Мы просто включаем неуправляемый DLL в наш проект и устанавливаем копию, локальную для истинного на файле. Но так как мы должны быть нацелены на обоих его более хитрое.
Мы нашли эту ссылку, Предназначающуюся и для 32 битов и для 64 битов с Visual Studio в том же решении/проекте, но это, кажется, ссылается на некоторый DLL, которые уже существуют на машине. Мы хотим, чтобы правильная версия DLL была скопирована в выходной каталог (мусорное ведро).
Любые подсказки или методы о том, как решить это, являются больше, чем приветствие.
Если вы устанавливаете свою конфигурацию иметь две платформы, один для версий на 64 бита и на 32 бита. Затем вы устанавливаете ссылку для каждой из платформ к корректной dll версии затем все, что необходимо сделать, установлен копия, локальный флаг на ссылочных свойствах и vsts обработает все это для вас. Никакой беспорядок никакая суета.
Вы можете захотеть посмотреть что-то вроде MSBuild, чтобы управлять своими сборками в этом случае. Тогда у вас может быть флаг компиляции, который вы используете для выполнения 32 или 64-битных компиляций. Делая это, это также позволит вам контролировать, какой dll вы нажимаете. Это звучит как ваш лучший вариант. Если вам не нравится MSBuild, вы также можете использовать NANT.
Мы имеем дело с этим все время с нашими проектами.
У нас есть неуправляемая 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, сохраняя вашу проблему копирования ее вообще.
Один другой вариант будет создать новую конфигурацию в Visual Studio, помимо отладки и выпуска .... возможно debug32 и Debug64 и т. Д. Один из настроек конфигурации - архитектура CPU.
Затем в событиях после сборки вашего проекта вы можете сделать старомодный оператор, если / elood, используя макрос имени платформы в качестве условия ...
или если вы использовали имя платформы в качестве подкаталога в вашем решении, где Неуправляемая DLL была сохранена, вы можете скопировать из каталога, используя имя платформы в каталог BIN.
Я только что прошел через эту же проблему с помощью обертки .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>