C# 如果没有特定的dll';文件夹里有什么/

C# 如果没有特定的dll';文件夹里有什么/,c#,wpf,C#,Wpf,我对编程非常陌生,希望能得到一些帮助。我刚安装了MahApps.Metro,它看起来非常漂亮。但是如果没有System.Windows.Interactivity.dll和MahApps.Metro.dll在同一个文件夹中,我无法运行该程序,如果我尝试在没有这两个dll的情况下运行它,它只是。。没有打开。有没有办法将这些DLL合并到exe中,或者不使用它们就运行它 提前感谢您的帮助 如果未使用这些程序集,则无法运行应用程序。毕竟,您正在使用的代码只存在于这些程序集中,如果您的应用程序找不到除关机

我对编程非常陌生,希望能得到一些帮助。我刚安装了MahApps.Metro,它看起来非常漂亮。但是如果没有System.Windows.Interactivity.dll和MahApps.Metro.dll在同一个文件夹中,我无法运行该程序,如果我尝试在没有这两个dll的情况下运行它,它只是。。没有打开。有没有办法将这些DLL合并到exe中,或者不使用它们就运行它


提前感谢您的帮助

如果未使用这些程序集,则无法运行应用程序。毕竟,您正在使用的代码只存在于这些程序集中,如果您的应用程序找不到除关机之外的所需代码,它应该怎么做

但是有一种方法可以将程序集嵌入到exe中,因此您只需重新分发一个文件。引用的程序集可以作为嵌入式资源添加(将dll添加到项目中,并将其
“生成操作”
设置为
“嵌入式资源”
)并从中加载

然后,您需要在发生当前事件时自己加载它。为此,您需要向此事件添加如下处理程序:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    String resourceName = 
        "YourDefaultNameSpace." + 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);
    }
};
对于WPF应用程序,您可以覆盖(在
app.xaml.cs
中)并将其添加到:

protected override void OnStartup(StartupEventArgs e) {
    base.OnStartup(e);
    // ---- Add the handler code here ----
}
原始来源和更多详细信息:
您可以使用ILMerge()

使用ILMerge,可以将所有程序集(文件夹中的所有DLL)合并到例如一个exe文件中。请参见以下说明:


但是部署所有程序集有什么问题呢。我认为这是很常见的这些天

会工作吗?是的,我认为只有一个EXE看起来更整洁,因为我13岁,只是和朋友共享usb到usb的程序,它们从来不会超过20mb,所以这没什么大不了的Mahapps是WPF:合并WPF程序集ILMerge无法合并WPF程序集。它们包含具有编码程序集标识的资源。ILMerge无法反序列化资源、修改程序集标识,然后重新序列化它们。对不起@RohylJoshi您只需要在应用程序启动的位置添加代码。如果您有一个WPF应用程序,您可以覆盖
App.xaml.cs
文件中的
App.OnStartup
,并将其添加到那里。您只需要将“YourDefaultNameSpace.”替换为应用程序的默认名称空间(您可以在应用程序属性中找到它(不要忘记末尾的点))。顺便说一句,此方法也适用于WPF程序集。请稍候。。。我有一个mainwindow.xaml,我是否将它放在mainwindow.xaml.cs中,如果我有,在哪里:O@RohylJoshi
App.OnStartup
会是一个更好的主意。有关如何覆盖它的更多详细信息,请参阅我编辑的文章。