我试图在已编译的exe文件中包含一个dll,这样我就不需要与exe一起分发该dll。我已经看到了很多答案,但其中的一个都不适合我!我已将dlltest.dll添加到“参考”,并将“复制本地”修改为False。我也将它添加到项目树中,并修改了“构建动作”以嵌入资源”(在Visual Studio中)
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;
}
}
}
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] 删除。
我来说两句