Задать вопрос
@SaddledSharp
Кодер. Увлекаюсь информационной безопасностью.

C#. Как правильно вместить внешние dll в один exe?

Всем привет.
Вообщем я уже гуглил, но так и не понял.
Нашел варианты с ILMerge и с Assembly.Load. ILMerge сказали что программа после него может вовсе не запустится, посмотрел Assembly.Load и так и не понял как правильно.
Вот у меня есть exe файл.
Рядом с ним есть 13 dll. Это дизайн формы и прочие другие. Мне требуется вместить их так, что бы получился ОДИН exe файл, но при этом программа работала. То есть как бы сделать статическую линковку.
  • Вопрос задан
  • 4653 просмотра
Подписаться 3 Простой 6 комментариев
Решения вопроса 2
shai_hulud
@shai_hulud
Соеденить все managed (!) dll в одну dll/exe можно с помощью ILRepack.
ILMerge мертв, его заменил ILRepack.
Сборку можно делать Post Build Event проекта вызовом ILRepack.exe на результатам сборки.

<Target Name="Repack" AfterTargets="BuiltProjectOutputGroup">
		<GetFrameworkPath>
			<Output TaskParameter="Path" PropertyName="FrameworkPath" />
		</GetFrameworkPath>
		<ItemGroup>
			<NetPlatformFolders Include="$(NuGetPackageFolders.Split(';'))"></NetPlatformFolders>
		</ItemGroup>
		<ItemGroup>
			<AllowDup Include="System.%2A" />
			<AllowDup Include="JetBrains.%2A" />
		</ItemGroup>
		<ItemGroup>
			<RapackTarget Include="$(TargetDir)MyDll1.dll" />
			<RapackTarget Include="$(TargetDir)MuDll2.dll" />
		</ItemGroup>
		<PropertyGroup>
			<ILRepack Condition="'$(ILRepack)' == ''">$(NuGetPackageRoot)ilrepack\2.1.0-beta1\tools\ILRepack.exe</ILRepack>
			<ILRepackTargetPlatform Condition="'$(TargetFramework)' == 'net45'">v4,$(FrameworkPath)</ILRepackTargetPlatform>
			<ILRepackTargetPlatform Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'netcoreapp2.0' or '$(TargetFramework)' == 'netstandard2.0'">v4</ILRepackTargetPlatform>
			<IlRepackLibs Condition="'$(TargetFramework)' == 'netstandard2.0'">@(NetPlatformFolders->'"/lib:%(FullPath)\netstandard.library\2.0.0\build\netstandard2.0\ref"', ' ')</IlRepackLibs>
			<IlRepackLibs Condition="'$(TargetFramework)' == 'netcoreapp2.0'">@(NetPlatformFolders->'"/lib:%(FullPath)\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0"', ' ')</IlRepackLibs>
			<IlRepackAllowDup>@(AllowDup->'"/allowdup:%(Identity)"', ' ')</IlRepackAllowDup>
			<IlRepackTargets>@(RapackTarget->'"%(Identity)"', ' ')</IlRepackTargets>
		</PropertyGroup>

		<Exec Command="$(mono) &quot;$(ILRepack)&quot; /target:exe &quot;/targetplatform:$(ILRepackTargetPlatform)&quot; /union /parallel /internalize &quot;/lib:$(TargetDir.TrimEnd('\'))&quot; $(IlRepackLibs) $(IlRepackAllowDup) &quot;/out:$(TargetPath)&quot; &quot;$(TargetPath)&quot; $(IlRepackTargets)" WorkingDirectory="$(SolutionDir)" />

		<Delete Files="@(RapackTarget);" />
	</Target>


Конечно надо всё настраивать.
Ответ написан
MvcBox
@MvcBox
Software Engineer [C/C++/JS(for Node.js)/etc]
Самое простое решение - https://enigmaprotector.com/ru/aboutvb.html
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SpacePurr
@SpacePurr
c#, wpf
Не все dll можно вместить в .exe.
Однако, попробуйте вот что. Если работаете в студии, то в Обозревателе Решений выберете ваш проект, перейдите в Ссылки. Нажмите на нужную вам ссылку и в свойствах переключите параметр "Внедрить типы взаимодействия" в True.
5dbed55dc1005875033495.png
Ответ написан
@Raimon
Самый простой способ - https://github.com/Fody/Costura

конечно не работает в 100% случаев, но для небольших приложений как правило не возникает проблем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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