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

使用#C.net 3.5

我知道ILMerge和类似的技术,但我真的想利用杰弗里里希特的建议 。

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

杰弗里里希特的代码:

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(); } } } 

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

  1. 究竟什么不起作用? 你是在编译时还是在运行时失败了?
  2. 你能展示那些无法编译或在运行时不能运行的代码吗?
  3. 当你说组件是“非嵌入式”时你是什么意思?

基本上,根据我的理解,你有代码试图使用2个程序集中的类。 此代码是静态的 ,这意味着必须在编译时知道类。 或者换句话说,您必须具有对这两个程序集的引用,以便编译使用其中定义的类型的代码。

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

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

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

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

应改为:

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