gpt4 book ai didi

c# - 在 c# exe 中包含 Dll

转载 作者:行者123 更新时间:2023-11-30 22:13:12 25 4
gpt4 key购买 nike

我试图在编译的 exe 中包含一个 dll,这样我就不需要用 exe 发送 dll。我已经看到很多答案,但没有一个对我有用!我已将 dlltest.dll 添加到“引用”并将“复制本地”修改为 False。我还将它添加到项目树中并将“构建操作”修改为嵌入式资源“(在 Visual Studio 中)

dlltest.cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dll
{
public class Class1
{
public int sum(int a, int b)
{
int c = a + b;
return c;
}
}
}

app.cs 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace Myapp
{
public class Loader
{
static void Main(string[] argss)
{
netsum thisapp = new netsum();
}
public class netsum
{
public netsum()
{
dlltest.Class1 c = new dlltest.Class1();
Console.WriteLine(c.sum(3, 10));
Console.ReadKey();
}
}
}
}

谢谢!

最佳答案

假设您想要使用 EmbeddedResource 方法而不是 ILMerge,您需要的最后一步是使程序集在程序执行期间可用:

static Assembly embedded_assembly;

static void Main(string[] argss)
{
embedded_assembly = LoadEmbeddedAssembly("empty_vs_project", "embedded-dll.dll");
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

netsum thisapp = new netsum();
}

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == embedded_assembly.FullName)
return embedded_assembly;
return null;
}

public static Assembly LoadEmbeddedAssembly(string resourceNamespace, string assemblyName)
{
var assemblyBytes = GetEmbeddedResource(resourceNamespace + "." + assemblyName);
return AppDomain.CurrentDomain.Load(assemblyBytes);
}

public static byte[] GetEmbeddedResource(string resourceName)
{
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, (int)stream.Length);
return bytes;
}
}

这里需要注意的事项:

  • 问题中的 dll 称为“embedded-dll.dll”,我已将其作为 link 项添加到 VS 项目以确保我们始终嵌入最新版本 - 使用一个 EmbeddedResource 操作,就像您正在做的一样(请参阅 here 以将项目项添加为链接)

  • 可执行文件的项目名为“empty_vs_project”,也是GetManifestResourceStream

    的资源命名空间
  • 代码使用了 AppDomain.AssemblyResolve 事件,该事件要求您的应用程序具有一定级别的权限;如果不是这种情况,您可以简单地将程序集提取到 AppDomain.BaseDirectory 中,然后让程序集加载程序在那里找到它(不过这需要目录的写权限。

喂!

关于c# - 在 c# exe 中包含 Dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300291/

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