Подтвердить что ты не робот

Как связать .DLL статически?

У нас есть (чистый родной С++).DLL, который создается VS. В качестве клиентов у нас есть некоторые собственные С++-приложения и .Net-Wrapper вокруг этой DLL, написанной на С++/CLI. Наконец, есть некоторые клиентские приложения для .Net-Wrapper, написанные на С#.

Моя проблема в том, что native.dll должен быть распределен по-другому, чем работает мир .Net, и VS не отслеживает эту DLL. Поэтому, чтобы все мои приложения С# работали правильно, я должен скопировать их в каждый исполняемый каталог или поместить его в% PATH% (чего я бы избегал на компьютерах разработчиков, поскольку они могут запускать разные приложения с различными версиями DLL). Даже большие проблемы возникают, если есть UserControls, которые ссылаются на Wrapper-DLL: вам нужно скопировать DLL в каталог VS или снова в% PATH%. Но худший случай возникает с нашим инструментом Translator. Этот инструмент отслеживает .Net-сборки и упаковывает их в пакеты-переводчики, которые могут быть отправлены внешнему переводчику. Насколько я знаю, нет возможности поместить в DLLL собственный .DLL!

Итак, я планирую связать собственную DLL статически с .Net-Wrapper, которая решит мои проблемы. Но для наших собственных приложений эта родная DLL все равно должна быть DLL.

Итак, у меня есть два варианта:

  • Сделайте два проекта (один, который генерирует статическую библиотеку, и тот, который создает динамический one = > я стараюсь избегать этого)
  • Найти решение для связывания DLL статически
  • Найдите способ, чтобы VS генерировал два выхода из одного проекта
4b9b3361

Ответ 1

В файле проекта С++ для dll создайте две конфигурации: одну, которая генерирует DLL, и одну, которая генерирует .lib. Два проекта не нужны, так как любой проект .NET/С++ может поддерживать несколько конфигураций сборки (это значит, что версии Release и Debug строятся по-разному).

Ответ 2

Другой вариант состоит в том, чтобы иметь два проекта, один проект будет выводить .lib, который может быть статически связан, и второй проект, который будет выводить .dll и будет иметь вашу .lib как зависимость, вы должны добавить .def к своему .dll с символами, которые вы планируете экспортировать, иначе он будет пустым.

Ответ 3

Возьмите копию DLL в Lib (Edit: Если вы не можете найти более дешевый вариант)