在DLL中将DLL作为嵌入式资源包含在WPF项目中

epa*_*alm 5 c# embed wpf dll include

我正在关注http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

我已将WPFToolkit.Extended.dll添加到我的解决方案中,并将其Build Action设置为Embedded Resource.

在App.OnStartup(StartupEventArgs e)中,我有以下代码:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";
    String assemblyName = Assembly.GetExecutingAssembly().FullName;
    Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
    using (stream)
    {
        Byte[] assemblyData = new Byte[stream.Length];
        stream.Read(assemblyData, 0, assemblyData.Length);
        return Assembly.Load(assemblyData);
    }
};
Run Code Online (Sandbox Code Playgroud)

调试器会两次触发此代码块.

第一次:

resourceName is "AssemblyLoadingAndReflection.StatusUtil.resources.dll"
assemblyName is "StatusUtil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
stream is null
Run Code Online (Sandbox Code Playgroud)

第二次:

resourceName is "AssemblyLoadingAndReflection.WPFToolkit.Extended.resources.dll"
assemblyName is "StatusUtil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
stream is null
Run Code Online (Sandbox Code Playgroud)

代码在遇到stream.Length时抛出异常,因为它为null.

我不能使用ILMerge,因为它是一个WPF项目.

H.B*_*.B. 8

您必须将字符串更改为"AssemblyLoadingAndReflection"应用程序集的名称.

有一件事你可以通过使用更多的反射来使这个代码更通用:

Assembly.GetExecutingAssembly().FullName.Split(',').First()
Run Code Online (Sandbox Code Playgroud)

别忘了附加一个圆点.如果dll不在应用程序集的资源中,这当然不起作用.