在c#exe中包含Dll

时间:2013-10-10 15:38:19

标签: c# dll

我正在尝试在编译的exe中包含一个dll,这样我就不需要用exe调度dll了。我已经看到很多答案但是没有为我工作! 我已将dlltest.dll添加到“Reference”并将“copy local”修改为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 个答案:

答案 0 :(得分: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操作,就像你正在做的那样(参见here将项目项添加为链接)

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

  • 代码使用AppDomain.AssemblyResolve事件,要求您的应用程序具有一定级别的权限;如果不是这样,你可以简单地将程序集解压缩到AppDomain.BaseDirectory并让程序集加载程序在那里找到它(这需要对目录的写权限。

HTH!

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分:0)

我建议Red GateSmartAssembly

它可以与许多其他非常有用的操作一起执行此操作,例如:

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

我非常喜欢它。

请注意,遗憾的是它不是免费的,并且有时可能会破坏您的构建,但它可以让您调试这些案例。你可以使用简单的操作,当然事情不太可能搞乱。