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

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

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

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

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

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

person mmmmmmmm    schedule 08.01.2009    source источник
comment
Я могу быть немного глупым здесь, но я не понимаю, почему ваши собственные приложения не могут использовать родную dll, а ваши .net-приложения используют dll, обернутую c++/cli.   -  person Niklas    schedule 08.01.2009
comment
Они оба могут. Но Wrapper-DLL ссылается на родную DLL, поэтому моим приложениям на C# нужны обе. Что нормально для оболочки, но боль в заднице для родной DLL.   -  person mmmmmmmm    schedule 08.01.2009
comment
Почему бы просто не создать библиотеку для dll? Вы сказали, что создаете dll с помощью VS, не так ли?   -  person Henry B    schedule 08.01.2009
comment
Как это сделать в Visual Studio 2019? stackoverflow.com/questions/67097557/   -  person    schedule 14.04.2021


Ответы (4)


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

person BmanInHouston    schedule 04.11.2009
comment
Но нет возможности собрать две конфигурации одного и того же проекта за один раз, не так ли? Обычно вы можете выбрать одну конфигурацию/платформу проекта в диспетчере конфигураций для конфигурации/платформы решения. - person mmmmmmmm; 06.11.2009
comment
Вы можете скопировать проект и настроить второй в этом решении по-другому. не забудьте установить разные промежуточные каталоги - person thewhiteambit; 04.03.2016

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

person Ismael    schedule 10.01.2009
comment
Звучит отлично. Я дам ему попробовать. На данный момент я решил проблему, добавив obj-файлы в качестве дополнительных входных данных для компоновщика в Wrapper-DLL (../NativeLib/$(PlatformName)/$(ConfigurationName)/*.obj). Но это немного грубо, и ваши варианты звучат лучше! - person mmmmmmmm; 14.01.2009
comment
Может ли кто-нибудь объяснить, как в этом контексте различаются .lib и .dll? - person Iqra.; 08.08.2017
comment
В Visual Studio у вас есть два разных типа приложений: «Статическая библиотека» и «DLL». Опция «Статическая библиотека» создает файл «.lib», но он не является исполняемым напрямую, объектный код объединяется без обработки. Параметр «DLL» создаст «.dll», который является исполняемым (т. е. вы можете использовать его через LoadLibrary), код объекта обрабатывается для разрешения вызовов функций, оптимизируется. - person Ismael; 08.08.2017

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

person SmacL    schedule 08.01.2009
comment
Немного дорого, не так ли? - person mmmmmmmm; 08.01.2009
comment
Это особенно дорого, учитывая, что у вас уже есть исходный код DLL. Вы можете просто перекомпилировать его как статический файл lib. Но .Net не будет его использовать, так как .Net не работает с файлами lib. Это также означает, что DLL To Lib вам не поможет. - person Rob Kennedy; 08.01.2009
comment
Ого, цена выросла примерно в 10 раз с тех пор, как я купил ее пару лет назад. Ой! - person SmacL; 08.01.2009
comment
Да, только что проверил, у меня версия 1.42, которая в 2003 году стоила 99 долларов, что в то время было приемлемой ценой. - person SmacL; 08.01.2009
comment
@Rob: .Net не должен создавать LIB. Мне нравится статически связывать LIB с проектом C++/CLI, создающим (смешанную) сборку .NET. Это работает, и поэтому DLL To Lib помогла бы... если бы это не было так дорого! (@smacl: 99 долларов было бы нормально, но 999 долларов...) - person mmmmmmmm; 08.01.2009
comment
Если у вас есть источник для dll, просто создайте библиотеку и используйте ее для статической ссылки? Или у вас нет источника для dll? - person Henry B; 08.01.2009
comment
Попробуйте написать им по электронной почте, они, вероятно, продадут его вам гораздо дешевле. Или можно попросить купить их старую версию за 99. - person Brian R. Bondy; 08.01.2009
comment
@PintSizedCat: у меня есть исходный код, но мне нужно создать DLL для наших собственных приложений и LIB для .NET-Wrapper. - person mmmmmmmm; 08.01.2009
comment
ЕСЛИ DLL To Lib будет работать, то она вам не нужна. VS уже вполне способен создать файл lib из вашего кода. Если вы можете связать файл .lib с вашим проектом .Net, сделайте это. Однако у меня сложилось впечатление, что сборки .Net нельзя связать с собственными файлами .lib. - person Rob Kennedy; 08.01.2009
comment
DLL to Lib может работать в Windows NT 3.1 или более поздней версии для серии NT и Windows 95 или более поздней версии для серии Windows 9x. - person tstenner; 10.05.2011

Вы можете сгенерировать dll и экспортировать точку входа в библиотеку, используя dllexport, это объясняется здесь

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

person kiriloff    schedule 14.11.2014