在C#exe中包含Dll

用户名

我试图在已编译的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被称为“嵌入式dll.dll”,和我将它作为一个链接项目到项目的VS,以确保我们始终嵌入的最新版本-与EmbeddedResource动作,就像你正在做的(见这里的将项目项添加为链接)

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

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

HTH!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章