将.dll合并到C#程序集中?

时间:2010-12-05 01:02:33

标签: c# dll embed

使用#C.net 3.5

我知道ILMerge和类似的技术,但我实际上想要使用Jeffrey Richter's suggestions

将此代码添加到构造函数后,会出现名称空间问题。

Jeffrey Richter的代码:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
        Byte[] assemblyData = new Byte[stream.Length];
        stream.Read(assemblyData, 0, assemblyData.Length);
        return Assembly.Load(assemblyData);
    }
};

我将两个DLL设置为“嵌入式资源”并将它们添加为参考,但是当我构建程序时,两个dll仍然是“Un embbeded”,然后我将它们作为参考删除但是当我构建时该程序有错误说:“无法找到类型或命名空间......你是否缺少using指令或程序集引用?”我将两个名称空间添加为using指令...,然后我尝试删除两个引用,两个使用指令和仍然错误。

这是我的代码:

using System.Reflection;
    namespace WindowsFormsApplication2
    {
        public partial class Ndice : Form
        {
            public Ndice()
            {
                AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
                {
                    String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";
                    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                    {
                        Byte[] assemblyData = new Byte[stream.Length];
                        stream.Read(assemblyData, 0, assemblyData.Length);
                        return Assembly.Load(assemblyData);
                    }
                };
                InitializeComponent();
               }
           }
        }

3 个答案:

答案 0 :(得分:3)

将它放在构造函数中,而不是InitializeComponent()。将使用指令添加到主类源代码文件中不是问题。

答案 1 :(得分:3)

根据您问题中的描述,为了回答可能需要的一些事情并不清楚:

  1. 究竟什么不起作用?你是在编译时还是在运行时失败了?
  2. 您能否显示无法编译的代码,或者在运行时无效?
  3. 当你说组件是“非嵌入式”时,你是什么意思?
  4. 基本上,根据我的理解,你有代码试图使用2个程序集中的类。此代码是 static ,这意味着必须在编译时知道类。或者换句话说,您必须引用这两个程序集,以便编译使用其中定义的类型的代码。

    当您添加这些程序集作为参考时,我真的不明白出了什么问题。如果困扰你的是你看到它们被复制到 bin / debug 目录中,那么它们仍然不应该阻止它们嵌入到你的主程序集中。因此,要进行测试,您可以尝试从 bin / debug 手动删除它们,或者将它们设置为“copy local = false”。

    还有一件事 - 你遇到的提到“使用”和“名称空间”的错误并不是关于命名空间的。此错误意味着编译器找不到所需的类型。这可能是因为你删除了对2个程序集的引用。

答案 2 :(得分:-1)

String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";

应更改为:

String resourceName = Application.Current.GetType().Namespace + "." + new AssemblyName(args.Name).Name + ".dll";