从单独的程序集加载ResourceManager会产生FileNotFound吗?

时间:2013-08-08 18:16:06

标签: c# reflection filenotfoundexception resourcemanager

我有一个程序集,我正在尝试使用反射加载并从中读取资源字符串。

所以,我使用这样的东西:

        config.Extras="C:\dev\foo.dll";
        string dir = Directory.GetCurrentDirectory();
        string tmp = Path.GetDirectoryName(config.Extras[0]);
        Directory.SetCurrentDirectory(tmp);
        var asm = Assembly.LoadFile(config.Extras[0]);
        foreach (var item in asm.GetManifestResourceNames())
        {
                ResourceManager rm = new ResourceManager(item, asm);
                string foo=rm.GetString("foo"); //error here
        }

但是,这会引发FileNotFoundException,因为它找不到foo.dll的引用程序集。 Foo.dll依赖Bar.dll。它会抛出错误,说它无法找到bar.dllbar.dll的实际位置与foo.dll位于同一目录中。

那么,我该如何解决这个错误呢?

1 个答案:

答案 0 :(得分:0)

Assembly类中的Load方法存在命名问题。没有人得到Load()错误。但是LoadFile()有一个很多太吸引人的名字。 LoadFrom应该是LoadFile,而LoadFile应该是LoadButUseThisOnlyWhenYouReallyKnowWhatItDoes()。

装配的加载上下文很难理解。 Suzanne Cooke已经在博客上写了很多内容,而不是在解释它上面做了很多努力:)大致上,当你使用LoadFile时,CLR不会跟踪程序集的来源,也不会阻止你加载程序集不止一次。该程序集中的类型是唯一的,并且从两个LoadFile调用加载的相同类型不相同。当您故意不想匹配时,您只能使用LoadFile。读取元数据的程序会感兴趣的东西,例如反编译器。

“不跟踪组件来自哪里”条款是这里的问题。您需要使用LoadFrom()。