我正在尝试在编译的exe中包含一个dll,这样我就不需要用exe调度dll了。我已经看到很多答案但是没有为我工作! 我已将dlltest.dll添加到“Reference”并将“copy local”修改为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();
}
}
}
}
谢谢!
答案 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)
它可以与许多其他非常有用的操作一起执行此操作,例如:
我非常喜欢它。
请注意,遗憾的是它不是免费的,并且有时可能会破坏您的构建,但它可以让您调试这些案例。你可以使用简单的操作,当然事情不太可能搞乱。