我正在制作一个差不多完成的应用程序,但有一件事情在困扰我。有大约12-13个文件必须在文件夹的目录中(一些.dll,一些.xml文件等)供应用程序运行,我想让我的应用程序尽可能紧凑,这意味着我想要应用程序使用的文件较少。所以我的问题是,我该怎么做?所有文件都可以包含在应用程序本身中吗? .dlls是否必须位于应用程序文件夹中,还是可以从其他位置引用它们?我正在考虑为所有这些文件创建一个文件夹,但如果.dll文件没有放在与应用程序相同的目录中,我认为我的应用程序不会运行。
答案 0 :(得分:2)
您可以处理AppDomain.AssemblyResolve
event并调用Assembly.Load(path)
从非标准文件夹加载DLL。
您甚至可以调用Assembly.Load(byte[])
加载EXE中嵌入的DLL作为资源。
请注意,JITter将在方法开始执行之前加载方法使用的所有类型(为了编译方法)。
因此,您必须在使用DLL中的任何方法或类型之前添加事件处理程序,并且添加处理程序的方法不能直接使用DLL。
答案 1 :(得分:0)
How to embed and access resources by using Visual C#看起来就像你需要的那样
[编辑]
如果要加载DLL,可以将上述内容与SLaks提及的AppDomain.AssemblyResolve
事件结合起来:
using System.IO;
using System.Reflection;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve +=
new ResolveEventHandler(MyResolveEventHandler);
var myWrappedClass1 =
currentDomain.CreateInstance(
"ConsoleApplication3.ClassLibrary1.dll",
"ClassLibrary1.Class1");
var myClass1 = myWrappedClass1.Unwrap();
Console.WriteLine(myClass1.GetType().InvokeMember(
"Add",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
myClass1,
new object[] { 1, 1 }));
Console.ReadLine();
}
private static Assembly MyResolveEventHandler(
object sender, ResolveEventArgs args)
{
Assembly currentAssembly=null;
Stream dllStream;
try
{
currentAssembly = Assembly.GetExecutingAssembly();
dllStream =
currentAssembly.GetManifestResourceStream(args.Name);
var length = (int)dllStream.Length;
var dllByteArray = new byte[length];
int bytesRead;
int offset = 0;
while ((bytesRead = dllStream.Read(
dllByteArray,
offset,
dllByteArray.Length - offset))
> 0)
offset += bytesRead;
return Assembly.Load(dllByteArray);
}
catch
{
Console.WriteLine("Error accessing resources!");
}
return null;
}
}
}
其中Class1
是一个只包含的类库:
namespace ClassLibrary1
{
public class Class1
{
public int Add(int x, int y)
{
return x + y;
}
}
}
并将DLL作为嵌入式资源添加到文件中:
答案 2 :(得分:0)
Microsoft为此目的提供了工具
答案 3 :(得分:0)
听起来你可以使用Embedded Resources作为部分内容(所有非DLL)。编译后可以使用ILMerge合并程序集,ILMerge有一些限制......