引用文件

时间:2010-11-12 03:49:19

标签: c# file dll reference

我正在制作一个差不多完成的应用程序,但有一件事情在困扰我。有大约12-13个文件必须在文件夹的目录中(一些.dll,一些.xml文件等)供应用程序运行,我想让我的应用程序尽可能紧凑,这意味着我想要应用程序使用的文件较少。所以我的问题是,我该怎么做?所有文件都可以包含在应用程序本身中吗? .dlls是否必须位于应用程序文件夹中,还是可以从其他位置引用它们?我正在考虑为所有这些文件创建一个文件夹,但如果.dll文件没有放在与应用程序相同的目录中,我认为我的应用程序不会运行。

4 个答案:

答案 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作为嵌入式资源添加到文件中:

alt text alt text

答案 2 :(得分:0)

查看this post

Microsoft为此目的提供了工具

答案 3 :(得分:0)

听起来你可以使用Embedded Resources作为部分内容(所有非DLL)。编译后可以使用ILMerge合并程序集,ILMerge有一些限制......