Вопрос по dll, visual-studio, managed, unmanaged, dependencies – Как заставить систему сборки Visual Studios понимать неуправляемые зависимости управляемых библиотек?

9

При построении управляемого кода Visual Studio правильно (и рекурсивно) копирует dll ссылочных управляемых проектов в выходную папку строящегося проекта.

Однако, если одна из этих ссылок представляет собой управляемую DLL, которая зависит от неуправляемых библиотек DLL, эти неуправляемые библиотеки DLL не копируются в выходную папку, даже если их соответствующие проекты находятся в том же решении и перечислены как зависимости управляемой библиотеки DLL.

Я понимаю, что эту проблему можно решить, если все проекты используют одну и ту же папку вывода. Мы уже делаем это для большинства проектов, но мы предпочитаем разделять папки вывода модульных тестов, вызывая вышеуказанную проблему для модульных тестов, которые используют управляемый Dll с неуправляемыми зависимостями.

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

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

Ваш Ответ

1   ответ
5

Один из обходных путей, по-видимому, заключается в добавлении другого узла в управляемый проект DLL, назвав неуправляемую DLL и установив Build Action = "Никто"и скопировать в выходной каталог = "Копировать, если новее ".

Изменить: Для создания проекта C ++ / CLR, я думаю, это будет работать:

Добавьте узел и установите его инструмент сборки наПользовательский инструмент сборки, Затем на странице «Шаг пользовательской сборки» установитекоманда вкопировать $ (InputPath) $ (OutDir) иВыходы в$ (OutDir) \ $ (InputFileName), Похоже, это должно работать.

@Ziphnor: отредактировал мой пост, добавив метод, который должен работать с проектами C ++ / CLR. Tarydon
Я считаю, что решение будет работать для управляемых проектов C #. Однако управляемый проект в нашем сценарии - это проект C ++ CLR. В C ++ CLR проектов нет "Скопировать в выходной каталог " свойство для элементов проекта, как в проектах C #. Есть ли другой способ указать такое действие? Ziphnor
Обратите внимание, что проекты C ++ / CLI также могут иметьPreserveNewest элемент, отредактированный вручную вItemGroup файла проекта, тамПросто нет поддержки для этого через пользовательский интерфейс страниц свойств. Cameron
Это звучит как отличный обходной путь. По крайней мере, это можно сделать в одном месте. Я попробую, как только у меня будет время, чтобы убедиться, что он работает правильно. Однако мне все равно было бы интересно, есть ли полностью автоматизированное решение. Ziphnor

Похожие вопросы