4

我的 WPF 应用程序有这样的输出文件:

de\
es\
fr\
hu\
it\
pt-BR\
Resources\
ro\
ru\
sv\
zh-Hans\
FileHelpers.dll
FileHelpers.DataLink.dll
FileHelpers.ExcelStorage.dll
Interop.Excel.dll
Interop.Office.dll
Ionic.Zip.dll
wpftoolkit.dll
Xceed.Wpf.AvalonDock.dll
Xceed.Wpf.AvalonDock.Themes.Aero.dll
Xceed.Wpf.AvalonDock.Themes.Metro.dll
Xceed.Wpf.AvalonDock.Themes.VS2010.dll
Xceed.Wpf.DataGrid.dll
Xceed.Wpf.Toolkit.dll
MyApp.Common.Extensions.dll
MyApp.Common.Helpers.dll
MyApp.Common.Types.Attributes.dll
MyApp.Security.dll
MyApp.Wpf.Controls.dll
MyApp.exe
MyApp.exe.config
licence.key
error.log

从开始的一切都是MyApp我自己开发的,其他一切都是由 3dParty 完成的

我试图使用 ilmerge 将我的文件合并到一个文件中,但出现错误:

ILMerge.Merge: ERROR!!: Duplicate type 'XamlGeneratedNamespace.GeneratedInternal TypeHelper' found in assembly 'Xceed.Wpf.DataGrid'. 我在这里找到的那​​个问题的答案xeed error reason than I've being reading ilmerge limits and assembly as resources by Jeffrey Richter

所以我发现 Jeffrey Richter 的解决方案非常有用。但我不能将它应用于我的程序,因为程序集上没有“构建操作”属性。

为了实现我的目标,我能做些什么吗?

在此处输入图像描述

4

2 回答 2

7

要使 Jeffrey 的想法发挥作用,您不仅应该将程序集添加为参考。只需将 dll 作为现有项目(右键单击项目->添加->现有项目)添加到您的项目中,您将获得它们的Build Action属性。还要在作为嵌入资源添加的引用上将Copy local property 设置为false 。

在此处输入图像描述

应用类构造函数:

public partial class App : Application
{
    public App()
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    }
    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var dllName = new AssemblyName(args.Name).Name + ".dll";
        var execAsm = Assembly.GetExecutingAssembly();
        var resourceName = execAsm.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(dllName));
        if (resourceName == null) return null;
        using (var stream = execAsm.GetManifestResourceStream(resourceName))
        {
            var assbebmlyBytes = new byte[stream.Length];
            stream.Read(assbebmlyBytes, 0, assbebmlyBytes.Length);
            return Assembly.Load(assbebmlyBytes);
        }

    }
}

请注意,此方法比通常的 dll 加载消耗更多的内存。

于 2013-11-01T21:51:32.333 回答
2

看看 RedGate 的 SmartAssembly。

于 2013-11-01T21:17:12.157 回答