我正在关注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添加到了我的解决方案中,并将其“构建操作”设置为“嵌入式资源”。
在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);
}
};
调试器两次点击此代码块。
第一次:
resourceName is "AssemblyLoadingAndReflection.StatusUtil.resources.dll"
assemblyName is "StatusUtil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
stream is null
第二次:
resourceName is "AssemblyLoadingAndReflection.WPFToolkit.Extended.resources.dll"
assemblyName is "StatusUtil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
stream is null
代码到达stream.Length时将引发异常,因为它为null。
我不能使用ILMerge,因为它是WPF项目。
最佳答案
您必须将字符串"AssemblyLoadingAndReflection"
更改为应用程序程序集的名称。
您可以通过使用更多反射使该代码更通用的一件事:
Assembly.GetExecutingAssembly().FullName.Split(',').First()
不要忘记添加一个点。如果dll不在应用程序程序集的资源中,则这当然不起作用。