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

本文关键字:ResourceManager FileNotFound 加载 集中 单独 程序 程序集 | 更新日期: 2023-09-27 18:26:51

我有一个程序集,我正试图用反射加载它,并从中读取Resource字符串。

所以,我用这样的东西:

        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位于同一目录中。

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

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

Assembly类中的Load方法存在命名问题。没有人会弄错Load()。但是LoadFile()的名称太吸引人了。LoadFrom应该是LoadFile,LoadFile应该是LoadButUseThisOnlyWhenYouReallyKnowWhatItDoes()。

程序集的加载上下文很难理解。苏珊娜·库克(Suzanne Cooke)在博客上写了很多关于它的文章,并没有在解释它时留下太多痕迹:)大致上,当你使用LoadFile时,CLR不会跟踪程序集的来源,也不会阻止你多次加载程序集。该程序集中的类型是唯一的,并且从两个LoadFile调用加载的相同类型不相同。只有当您有意不想要匹配时,才可以使用LoadFile。读取元数据的程序会感兴趣的东西,例如反编译器。

这里的问题是"不记录程序集的来源"条款。您需要使用LoadFrom()。