У меня есть решение с n проектами csharp и cpp project сверху, этот cpp предоставляет интерфейсы и заголовки, так что эти csharp могут использоваться в других решениях cpp.
Машина сборки настроена на сборку проекта csharp с архитектурой anyCPU, поэтому для каждой сборки в Solution \ bin \ Release предоставляется одна сборка. Для cpp anyCpu недоступен, поэтому я собираю проект дважды и сохраняю сборки в папках Solution \ bin \ Release \ x86 и x64.
Это все, чтобы упаковать его в nuget как единый пакет с файлом .targets, чтобы облегчить его использование в других проектах cpp.
Проблема в том, что проект cpp ищет сборки csharp, используя ResolveAssemblyReference, и не может их найти, выдавая ошибочное сообщение:
ResolveAssemblyReferences:
Primary reference "Implementation".
Could not find dependent files. Expected file "C:\Jenkins\Workspace\Solution\bin\Release\x86\Implementation.dll" does not exist.
Could not find dependent files. Expected file "C:\Jenkins\Workspace\Solution\bin\Release\x86\Implementation.dll" does not exist.
Resolved file path is "C:\Jenkins\Workspace\Solution\bin\Release\x86\Implementation.dll".
Reference found at search path location "".
Я попытался изменить поведение ResolveAssemblyReferences, используя свойства командной строки, пользовательские цели / свойства, но безуспешно. Параметры описаны в https://docs.microsoft.com/en-us/visualstudio/msbuild/resolveassemblyreference-task?view=vs-2017 кажется, что вычисляется во время процесса сборки, и я не могу ввести любое значение, которое в этом случае должно быть что-то вроде $ (OutDir) ..
Кажется, что единственное выполнимое решение — скопировать c # dll в каждую папку cpp, но я не думаю, что это способ решить это должным образом.
Закрытие я получил с помощью / p: ReferencePath, как показано ниже:
«C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ BuildTools \ MsBuild \ 15.0 \ bin \ MsBuild.exe» / p: BuildProjectReferences = false / p: Конфигурация = Выпуск / p: DebugType = полный / p: DebugSymbols = true / p: PlatformToolset = v120 /p:WindowsTargetPlatformVersion=8.1 /p:ForceImportBeforeCppTargets=»C:\Jenkins\Workspace\Solution\Cpp.props «/ p: OutDir =» C: \ Jenkins \ Workspace \ Solution \ bin \ » Выпуск \ x86 \ «/ p: платформа = Win32 / t: интерфейс сборки \ Interface.vcxproj / p: ReferencePath =» C: \ jenkins \ workspace \ Solution \ bin \ Release «
Мой пользовательский Cpp.props делает:
<Target Name="Output" BeforeTargets="ResolveAssemblyReferences">
<Message Text="AssemblySearchPaths: $(AssemblySearchPaths)" />
</Target>
и добавив / p: ReferencePath, он был добавлен в AssemblySearchPaths в качестве второй записи после {CandidateAssemblyFiles}; но он все еще не находит эти библиотеки
Задача ещё не решена.
Других решений пока нет …