加载插件DLL文件,“在动态程序集中不支持调用的成员。”

29
我们有自定义的DLL文件,这些文件没有包含在我们的初始设置文件中。它们会在运行时加载。在使用.NET 2.0时,这个过程是可以正常工作的,但是现在我们使用.NET 4.0时却出现了“在动态程序集中不支持调用的成员”错误信息。
try
{
    assem = Assembly.LoadFrom(fi.FullName); //fi is FileSystemInfo
}
catch (FileLoadException) {}
catch (BadImageFormatException) {}
catch (System.Security.SecurityException) {}
catch (ArgumentException) {}
catch (PathTooLongException) {}
5个回答

34

出现此错误是因为无法在动态程序集上调用 Assembly.Load。您必须在使用它们之前将动态程序集过滤掉。

var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(p => !p.IsDynamic);


2
问题在于加载程序集……如何在尚未加载程序集的情况下执行此操作?使用Assembly.LoadFile(assemblyPath)……您只有一个文件路径。 - War
3
我在调用 assembly.Location 时遇到了这个错误。对 IsDynamic 进行过滤是我的解决方法。 - Graham

30

对于我来说,这个问题是由于没有嵌入Aspose dll许可证引起的:http://www.aspose.com/community/forums/thread/423874/initializing-the-license-file.aspx

他们的代码在没有检测到许可证时注入动态程序集,导致了他们的DLL失败,以及其他一堆与动态程序集不兼容的代码。

我不确定这是否是确保使用第三方dlls进行注册使用的常见许可/激活方法,所以如果是的话,我会在这里发布它供谷歌搜索。


2
5年过去了,这仍然是一个根本原因。 - edwardrbaker

4

0
我花了很多时间来解决这个问题。
我们正在加载另一个类库项目的DLL,该DLL又会即时创建实例。所以下面的方法适合我。
解决方案:
将DLL的引用添加到主项目中。

0

我遇到了相同的错误。我们代码库中有一个方法,它会遍历当前 AppDomain 中加载的程序集,并根据名称查找给定的资源。

        Assembly[] allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        
        foreach (Assembly tempAssembly in allAssemblies)
        {
            Stream resourceStream = tempAssembly.GetManifestResourceStream(resourceName);
            // ...
            
        }
        

如果我们碰巧遇到一个动态程序集,调用GetManifestResourceStream时会出现“在动态程序集中不支持所调用的成员”错误。

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