Упаковка приложения WinForms вместе с собственной DLL

Пытаюсь выяснить, как упаковать следующее решение с помощью Visual Studio 2017 Desktop Bridge (проект упаковки приложений):

  1. Библиотека .NET DLL.
  2. Ссылка на исполняемый файл WinForms 1.
  3. Собственная библиотека C ++, экспортирующая некоторые функции, используемые в пунктах 1 и 2, с помощью [DllImport].

Я добавил проект 2 в раздел «Приложения» пакета и собрал его. В целевой папке есть EXE (из проекта 2) и DLL (из проекта 1).

И вопрос: как правильно добавить проект 3 (нативную библиотеку c ++) в пакет? У меня есть конфигурации проекта x86 и x64 для этой библиотеки DLL.


person thims    schedule 12.02.2018    source источник


Ответы (1)


Вот как это сделать - см. Скриншоты ниже для иллюстрации:

1) создайте папку в вашем проекте Winforms в качестве цели для вашей собственной библиотеки DLL

2) добавьте этап события после сборки, чтобы скопировать собственную DLL в эту папку

3) в этой папке отметьте DLL как часть проекта

4) Убедитесь, что для свойств установлены значения «Содержимое» и «Копировать для вывода».

5) теперь проект упаковки подберет родную DLL и включит ее в пакет

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

person Stefan Wick MSFT    schedule 13.02.2018
comment
А как насчет конфигураций x86 / x64? Похоже, мне нужно вручную отредактировать файл * .csproj для WinFormsApp, чтобы добавить условия для включения версии NativeDll x64 или x86 в зависимости от разрядности WinFormsApp, верно? - person thims; 13.02.2018
comment
Вы можете использовать пользовательский интерфейс диспетчера конфигурации для решения, чтобы настроить пакеты x86 и x64 соответственно, чтобы нужный вариант вашей собственной библиотеки DLL был упакован в правильный пакет. Я добавил больше скриншотов, чтобы прояснить эту часть. - person Stefan Wick MSFT; 13.02.2018
comment
Я не понимаю, почему кто-то проголосовал против этого без объяснения причин. После некоторых колебаний из-за этого это оказалось единственным решением, которое я смог найти, которое работало для меня для собственной (не-COM) DLL. - person Arda; 27.06.2018
comment
@thims, я не уверен, что последний комментарий Стефана надежно решит вашу проблему, касающуюся x86 / x64, поскольку, похоже, он полагается на перезапись одной DLL. У меня была аналогичная потребность в Debug vs. Release, которую я решил, создав отдельную DLL для каждой конфигурации и добавив условие для каждой включенной DLL в файл проекта. Вы можете сделать то же самое для x86 и x64, добавив условия для $ (Platform). К сожалению, Visual Studio не предоставляет тег Condition в пользовательском интерфейсе, поэтому его нужно добавлять вручную. См. docs.microsoft.com / ru-ru / visualstudio / msbuild / - person Arda; 27.06.2018
comment
@StefanWickMSFT - Возможно ли [DllImport] наши dll c ++ и вызывать их в настольном приложении FullTrust? Большая часть логики нашего приложения написана на C ++. - person Lance; 30.04.2019
comment
да. Если требуется дополнительная информация, задайте для этого новый вопрос. - person Stefan Wick MSFT; 01.05.2019