2011-07-06 38 views
1

背景:Merging dlls into a single .exe with wpf编译/合并DLL到独立的EXE与WPF

我怎么合并一个.dll引用到.exe文件,我看了上面的帖子,得到了其背后的原则,但我不能够弄清楚如何做到这一点(我是新手,抱歉) 参考文件是HtmlagilityPack.dll

目前我App.xaml.cs包含:

public partial class App : Application 
    { 
     public App(){ 
      AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly); 

      // proceed starting app... 
     } 

     static Assembly ResolveAssembly(object sender, ResolveEventArgs args) 
     { 
      //We dont' care about System Assembies and so on... 
      if (!args.Name.ToLower().StartsWith("Html")) return null; 

      Assembly thisAssembly = Assembly.GetExecutingAssembly(); 

      //Get the Name of the AssemblyFile 
      var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll"; 

      //Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder 
      var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name)); 
      if (resources.Count() > 0) 
      { 
       var resourceName = resources.First(); 
       using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) 
       { 
        if (stream == null) return null; 
        var block = new byte[stream.Length]; 
        stream.Read(block, 0, block.Length); 
        return Assembly.Load(block); 
       } 
      } 
      return null; 
     } 
    } 

还有什么地方我应该做出改变?,我正在尝试过去一个小时http://blog.mahop.net/post/Merge-WPF-Assemblies.aspx的一个例子,但无法弄清楚如何用HtmlAgilityPack来做到这一点。

+0

错误是什么?你的应用中发生了什么? –

+0

应用程序编译,但该DLL文件没有包含在EXE中,当我尝试作为一个独立的(从文件夹中删除HtmlAgilityPack.dll)运行该EXE,它退出说明一些error.i已尝试设置break-在上面的代码点和我的程序永远不会输入上面的wriiten代码。为什么? – TarunG

+0

我认为你应该更仔细地调试这个应用程序的初始负载,看看AssemblyResolve事件正在寻找哪些其他程序集。这行很可能是你的问题的关键:if(!args.Name.ToLower()。StartsWith(“Html”))return null; - 加载htmlAgilitypack时,您可能需要加载其他依赖项。你不应该简单地返回null,任何“AssemblyResolve”的执行都意味着当前的AppDomain正在寻找一个引用。 –

回答

1

好的,最后不得不使用SmartAssembly程序。 但仍在寻找一个解决方案来完成代码。

+0

我也想看一个有效的例子。我想问题在于你检索资源的方式。 –

+0

下面是一个工作示例:http://blog.mahop.net/post/Merge-WPF-Assemblies。aspx,但遗憾的是对我没有太大的帮助。 – TarunG

0

你的代码看起来稍微偏离,它看起来应该更多这样的:

public class App : Application 
{ 
    [STAThreadAttribute()] 
    public static void Main() 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly); 
     // etc... 
    } 

    // etc... 

然后,您还需要修改“启动对象”在项目中使用App类的属性页面设置(即上面的代码) - 然后你应该看到这个类的Main方法是在开始调试时执行的第一个代码。