2

我试图在编译的 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();
            }
        }
    }
}

谢谢!

4

4 回答 4

2

假设您要使用 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”,我已将其作为链接项添加到 VS 项目中,以确保我们始终嵌入最新版本 - 使用 EmbeddedResource 操作,就像您正在做的一样(请参阅此处将项目项添加为链接)

  • 可执行文件的项目名称是“empty_vs_project”,这也是资源命名空间GetManifestResourceStream

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

于 2013-10-10T15:43:08.657 回答
1

ILMerge 应该为您工作(可用于将多个 .NET 程序集合并为单个程序集的实用程序): http ://www.microsoft.com/en-us/download/details.aspx?id=17630

于 2013-10-10T15:43:30.383 回答
0

我建议Red GateSmartAssembly

它可以与许多其他非常有用的操作一起做到这一点,例如:

  • 压缩
  • 合并
  • 加密
  • 修剪(从可执行文件中删除未使用的代码)
  • 混淆
  • 自动错误报告
  • 更多的

我非常喜欢它。

请注意,不幸的是它不是免费的,有时可能会弄乱您的构建,但它可以让您调试这些情况。当然,您可以只使用简单的操作,其中的东西不太可能搞砸。

于 2013-10-10T15:51:07.807 回答
0

您可以使用工具 ILMerge 将 EXE 和 DLL 合并到一个程序集中:
http
://research.microsoft.com/en-us/people/mbarnett/ILMerge.aspx 下载页面: http:
//www.microsoft。 com/en-us/download/details.aspx?id=17630

于 2013-10-10T15:41:21.067 回答