#net #visual_studio
Некоторые компоненты слабо связанного кода находятся в одной сборке. Хотелось бы
контролировать отсутствие между ними циклических ссылок на этапе компиляции, не разбивая
сборку. Наиболее логичным решением выглядит использование нескольких проектов сборок,
которые потом компилируются в одну сборку. Циклические ссылки предотвращаются стандартным
механизмом работы проектов, а сборка сливается.
Есть ли такая технология для Microsoft Visual Studio?
Ответы
Ответ 1
Вы можете попробовать компилировать не в целую сборку (.dll), а в объектный файл (.netmodule). Для этого нужно или строить при помощи msbuild, либо открыть файл проекта вручную, найти строку видаLibrary и поменять её наModule . (Учтите, компиляция этого через Visual Studio считается неподдерживаемым сценарием. Но у меня работало.) Затем, для компоновки модулей в assembly вам нужно вручную вызвать компоновщик. Например, в каком-либо post-build step'е: call "%VS120COMNTOOLS%vsvars32.bat" set M1=$(SolutionDir)Module\$(OutDir)Module.netmodule set M1PDB=$(SolutionDir)Module\$(OutDir)Module.pdb set M2=$(SolutionDir)Main\$(OutDir)Main.netmodule set ENTRY=Main.Program.Main link /ltcg /assemblymodule:"%M1%" "%M2%" /entry:%ENTRY% /subsystem:CONSOLE /out:"$(SolutionDir)Program.exe" /debug copy /b %M1% "$(SolutionDir)" copy /b %M1PDB% "$(SolutionDir)" Разумеется, вам придётся подставить нужные пути вручную. Вот большое исследование по теме вопроса. (Уверен, это всё можно автоматизировать при помощи msbuild, но я не знаю, как именно.)Ответ 2
Несколько сборок можно склеить в одну уже после компиляции, используя утилиту ILMerge. Она есть на NuGet.org: Install-Package ilmerge Формат вызова: ilmerge /lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319" /lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" /targetplatform:v4 /out:out.dll mydll1.dll mydll2.dll пути стоит подправить на актуальные. Аналогичные утилиты - il-repack, Mono.MergeОтвет 3
На самом деле вам нужна проверка на зависимости, а не костыльно-ориентированное решение на отдельных сборках с подпорками ilmerge. Архитектурно верно будет реализовать проверку с помощью анализаторов на базе нового компилятора Roslyn, который доступен в Visual Studio 2015 или выше. Если вы реализуете нужный вам анализатор, то результаты анализа будут доступны вам в списке ошибок в студии ещё до компиляции, и нарушения будут подсвечены прямо в коде. См. C# and Visual Basic - Use Roslyn to Write a Live Code Analyzer for Your API и другие статьи по теме.
Комментариев нет:
Отправить комментарий