无法从程序集中加载类型

5

在您说话之前,我已经阅读了此问题的先前提问。那里的答案没有解决我的问题。

如果您知道答案,这似乎很简单。以下是我的问题:

我有一个包含多个项目的解决方案,我正在创建一个基于插件的应用程序,在其中使用反射来加载所有程序集。这部分很好,我像这样加载了所有程序集。

        var filePaths = Directory.GetFiles(@"C:\CustomerServiceModule\", "*.dll", SearchOption.AllDirectories).Where(n => n.Contains("bin"));
        foreach (var f in filePaths)
        {
            Assembly.LoadFile(f);
        }

现在我想创建一个类型的实例,以便与它一起工作:

            var assembly = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.ManifestModule.Name == "Kayako.dll").SingleOrDefault();
            var name = assembly.GetTypes();
            var type = assembly.GetType("Kayako.KayakoData");
            var lol = Activator.CreateInstance(type);

这很糟糕,因为在KayakoData内部我有以下内容:

KayakoService _service = new KayakoService("xxx", "yyy", "zzz");

这个服务是一个可运行的程序集,我以前用过。版本号没有问题,在GAC中也没有覆盖它的内容,使用程序集绑定日志查看器也没有发现任何错误。但仍然会出现如下错误:
[System.LoadTypeException]{"Could not load type 'KayakoRestAPI.KayakoService' from assembly 'KayakoRestAPI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.":"KayakoRestAPI.KayakoService"}。
有人有什么好的想法吗?我已经一直在盯着这个问题看了。如果我从KayakoData中删除服务部分,整个东西就能正常工作,但我真的需要运行这项服务。

1
你尝试使用融合日志查看器(fuslogvw.exe)来诊断问题了吗? - Eric J.
相对于Kayako.KayakoData目录,您的KayakoRestAPI程序集位于磁盘上的哪个位置? - Jan
所有程序集都设置为 AnyCPU 了吗?这个程序集还引用了哪些其他程序集? - Ian Mercer
Darin Dimitrov修复了我的问题,虽然回复很快,但还是非常感谢。 - MartinNielsen
2个回答

7
LoadFile方法的文档中引用如下:
使用LoadFile方法加载和检查具有相同标识但位于不同路径的程序集。 LoadFile不会将文件加载到LoadFrom上下文中,并且不像LoadFrom方法那样使用加载路径解析依赖项。 LoadFile在这种有限情况下非常有用,因为无法使用LoadFrom加载具有相同标识但不同路径的程序集;它只会加载第一个这样的程序集。
结论:请尝试使用LoadFrom以加载相关程序集。

1

您只需要更改该项目的程序集信息中.dll版本,然后重新构建解决方案即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接