Упаковка файлов C# в DLL


В настоящее время я использовал SWIG для преобразования некоторых библиотек C++, которые мне нужны в C#, чтобы использовать их прецедент, который я реализую в C#, выводом были некоторые CS-файлы, которые должны быть включены в проект, и есть projectNameBridge.DLL-файл.

Включение всех этих cs в мой проект делает его немного грязным, поэтому мне было интересно, есть ли способ обернуть эти CS-файлы в DLL, который может быть добавлен непосредственно в качестве ссылки, чтобы содержать все эти файлы.

Любой предложения?

2 2

2 ответа:

Примечание относительно компиляции DLL


Visual studio имеет по крайней мере три цели компиляции (в зависимости от того, что вы установили и т. д.):

  • x86 - x64 - anycpu

Как они взаимодействуют и ко-привычка может быть боль, если не сделано правильно, и они ведут себя по-разному в зависимости от количества бит ОС, которую вы используете, поэтому я добавил небольшое, краткое руководство о том, как битность (за неимением лучшего термина) вызывает взаимодействие между различными настройками:

Давайте возьмем 3 DLL-файла, все с тем же кодом в них, который мы, в истинном стиле Blue Peter, подготовили ранее:

  • anycpu.dll -- compiled anycpu
  • x86.dll -- compiled x86
  • x64.dll -- compiled x64

И 3 исполняемых файла все делают то же самое: вызывая консольный вывод "Bitness interplay" из dll.

  • anycpu.exe -- compiled anycpu
  • x86.exe -- compiled x86
  • x64.exe -- составлено x64

Код идентичен во всех случаях, однако цель компиляции изменилась, и они работают/отказываются работать в 32/64-битных вариантах ОС следующим образом:

32-битная ОС

  • anycpu.exe -- выполняется как 32-разрядный процесс использования dll файлы: загрузить anycpu.dll и x86.dll вызывает BadImageFormatException , если он пытается нагрузка x64.dll
  • x86.exe -- выполняется как: 32-битный процесс использование DLL: может загрузить anycpu.dll и x86.dll вызывает BadImageFormatException, если он пытается загрузить x64.dll
  • x64.exe -- Выполняется как: BadImageFormatException , когда он пытается запустить

64-битная ОС

  • anycpu.exe -- выполняется как 64-разрядный процесс использования dll файлы: загрузить anycpu.dll и x64.dll вызывает BadImageFormatException , если он пытается нагрузка x86.dll
  • x86.exe -- выполняется как: 32-битный процесс использование DLL: может загрузить anycpu.dll и x86.dll вызывает BadImageFormatException, если он пытается загрузить - х64.dll
  • x64.exe -- выполняется как: 64-битный процесс использование DLL: может загрузить anycpu.dll и x64.dll вызывает BadImageFormatException, если он пытается загрузить x86.dll

Итак, если вы действительно нужна определенная битность/битливость (нет хорошего слова для этого!) Я бы придерживался цели компиляции anycpu: она немного менее совершенна, чем конкретный таргетинг, но ваше творение должно заставить вас гордиться независимо от вкуса битов (это более приятный способ сказать это), на которых вы работаете.


Важно:

Мой брат сделал хорошее замечание, которое стоит упомянуть: некоторые SDK требуют определенной цели компиляции (ANYCPU, x84, x64 и т. д.) и используют неправильный можно вызвать ошибки компиляции / выполнения.


Запуск проекта

Создать DLL-файл в C# еще проще, чем в C++: Сначала мы создаем новый проект, основанный на библиотеке классов типа

Запуск проекта dll

После установки относительных параметров по вашему выбору и последующего нажатия кнопки " OK " мы почти закончили, так как VS аккуратно переносит нас в файл C#, указанный вами на предыдущем экране.

Можно также добавить код для выполнения действий, которые мы требуем от библиотеки DLL, чтобы иметь возможность выполнять...

Поехали!

Теперь, когда код готов, вы можете построить проект, используя режим Release или Debug (в зависимости от того, что больше всего соответствует вашим потребностям).

Построение библиотеки DLL

Перейдите в соответствующую папку сборки..... Перейдите в соответствующую папку И Вуаля! ваша блестящая новая библиотека DLL готова к использованию!

И теперь вы можете вызвать DLL из другого проекта C# на досуге:)


Надеюсь, это поможет, и, позвольте мне знайте, если вам нужна дополнительная информация:)

Поместить их в отдельный проект с типом вывода "библиотека классов"?