从资源加载的程序集引发无法加载文件或程序集

时间:2014-03-21 10:31:07

标签: c# .net reflection .net-assembly embedded-resource

我正在编写一个应该创建一些快捷方式的简单应用程序。 为此,我使用Interop.IWshRuntimeLibrary作为嵌入式资源添加。

在类init上我调用

Assembly.Load(Resources.Interop_IWshRuntimeLibrary);

我也尝试过:

AppDomain.CurrentDomain.Load(Resources.Interop_IWshRuntimeLibrary);

当我在VisualStudio输出窗口中构建应用程序时,我看到程序集已加载:

  

已加载“Interop.IWshRuntimeLibrary”。

但是,当我尝试使用该程序集中的对象时,它给了我这个例外:

  

“无法加载文件或程序集”Interop.IWshRuntimeLibrary,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null“。

1 个答案:

答案 0 :(得分:4)

它并不像您想象的那么简单,如果Visualstudio说加载了引用,则意味着在构建期间加载了项目的引用。它与你要实现的目标无关。

最简单的方法是绑定到程序集解析失败时调用的AppDomain.AssemblyResolve Event

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

然后:

private Assembly MyResolveEventHandler(object sender,ResolveEventArgs args)
{
    Assembly rtn=null;

    //Check for the assembly names that have raised the "AssemblyResolve" event.
    if(args.Name=="YOUR RESOURCE ASSEMBLY NAME")
    {
        //load from resource
        Stream resxStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YOUR RESOURCE ASSEMBLY NAME");
        byte[] buffer = new byte[resxStream.Length];
        resxStream.Read(buffer, 0, resxStream.Length);
        rtn = Assembly.Load(buffer);
    }
    return rtn;         
}