gpt4 book ai didi

c# - ILMerge 替代方案,如何将应用程序的依赖 DLL 嵌入到 EXE 文件中?

转载 作者:行者123 更新时间:2023-11-30 22:40:06 24 4
gpt4 key购买 nike

As stated here我试图将 dll 嵌入到 exe 应用程序中,以便仅分发一个 exe,但是当我尝试在安装了完整 .NET 4 的 xp 机器上运行我的应用程序时,它只是崩溃而没有错误,我将以下代码放在主要方法

[STAThread]
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";

using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmrPrincipal());
}

我有一个名为 dll 的文件夹,我将其放置在其中

Functions.Shared.dll
Alex.UI.dll
Alex.Controls.dll

我将其构建操作设置为“嵌入式资源”。

如果我删除那段代码并将 dll 设置为通过单击一次安装程序包含在内,它就可以正常工作。顺便说一句,我使用 .NET Framework 4 完整配置文件和 VS2010 SP1

最佳答案

当它试图对 Main() 方法进行 jit 时,抖动变得非常严重。 AssemblyResolve 还没有注册,先有鸡还是先有蛋的问题。您只能在 Main 中使用可用的类型,因此您必须远离 frmrPrincipal。使用一些辅助方法可以解决该问题,但现在您必须使用 [MethodImpl] 来抑制内联。不允许 ngen.exe 执行其工作也是在开枪。

using System.Runtime.CompilerServices;
...
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
// etc..
}
AvoidJitterBombing();
}

[MethodImpl(MethodImplOptions.NoInlining)]
private static void AvoidJitterBombing() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmrPrincipal());
}

关于c# - ILMerge 替代方案,如何将应用程序的依赖 DLL 嵌入到 EXE 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5381708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com