C# 使用wpf将dll编译/合并为独立exe

C# 使用wpf将dll编译/合并为独立exe,c#,.net,wpf,dll,C#,.net,Wpf,Dll,背景: 我应该如何将.dll引用合并到.exe文件中,我读了上面的文章,得到了它背后的原理,但我不知道怎么做?(对不起,我是新手) 参考文件是HtmlagilityPack.dll 当前我的App.xaml.cs包含: public partial class App : Application { public App(){ AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHan

背景:

我应该如何将.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;
        }
    }

我还应该在哪里进行更改?我已经尝试了一个小时的示例,但无法找到如何使用HtmlAgilityPack进行更改。

好的,最后不得不使用SmartAssembly程序。
但是仍然在寻找通过代码实现的解决方案。

好的,最后不得不使用SmartAssembly程序。
但仍在寻找通过代码实现的解决方案。

您的代码看起来有点不对劲,它应该更像这样:

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

    // etc...

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

您的代码看起来有点不对劲,它应该更像这样:

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

    // etc...

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

错误是什么?你的应用程序中发生了什么?应用程序会编译,但dll文件不包含在exe中,当我尝试以独立方式运行.exe(从文件夹中删除HtmlAgilityPack.dll)时,它会退出并声明一些错误。我曾尝试在上述代码中设置断点,但我的程序从未输入上述wriiten代码。为什么?我认为您应该更仔细地调试此应用程序的初始负载,并查看AssemblyResolve事件正在查找哪些其他程序集。这一行很可能是问题的关键:如果(!args.Name.ToLower().StartsWith(“Html”))返回null;--加载htmlAgilitypack后,您可能需要加载其他依赖项。您不应该简单地返回null,任何执行“AssemblyResolve”的操作都意味着当前AppDomain正在寻找引用。但是代码从未进入ResolveAssembly块!!。要我在App.xaml中添加一些东西吗?我也知道了。能否主动加载HtmlAgilityPack.dll程序集?而不是将加载延迟到“解析”处理程序中?我所知道的触发该事件的唯一方法是在编译时引用“HtmlAgilityPack.dll”,生成,然后删除该dll。错误是什么?你的应用程序中发生了什么?应用程序会编译,但dll文件不包含在exe中,当我尝试以独立方式运行.exe(从文件夹中删除HtmlAgilityPack.dll)时,它会退出并声明一些错误。我曾尝试在上述代码中设置断点,但我的程序从未输入上述wriiten代码。为什么?我认为您应该更仔细地调试此应用程序的初始负载,并查看AssemblyResolve事件正在查找哪些其他程序集。这一行很可能是问题的关键:如果(!args.Name.ToLower().StartsWith(“Html”))返回null;--加载htmlAgilitypack后,您可能需要加载其他依赖项。您不应该简单地返回null,任何执行“AssemblyResolve”的操作都意味着当前AppDomain正在寻找引用。但是代码从未进入ResolveAssembly块!!。要我在App.xaml中添加一些东西吗?我也知道了。能否主动加载HtmlAgilityPack.dll程序集?而不是将加载延迟到“解析”处理程序中?我知道触发该事件的唯一方法是在编译时引用“HtmlAgilityPack.dll”,构建,然后删除该dll。我还想看一个工作示例。我想问题在于您检索资源的方式。这里有一个工作示例:,但遗憾的是,它对我没有多大帮助。我还希望看到一个工作示例。我想问题在于您检索资源的方式。下面是一个工作示例:,但遗憾的是,它对我没有多大帮助。