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

Posted

技术标签:

【中文标题】加载插件 DLL 文件,“动态程序集中不支持调用的成员。”【英文标题】:Loading plug-in DLL files, "The invoked member is not supported in a dynamic assembly." 【发布时间】:2012-04-22 21:20:35 【问题描述】:

我们的初始设置文件中没有包含自定义 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) 

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

问题在于加载程序集...如何在尚未加载的程序集上执行此操作? Assembly.LoadFile(assemblyPath) ... 你所拥有的只是一个文件路径。 我在调用assembly.Location 时收到此错误。过滤掉IsDynamic 是我的解决方案【参考方案2】:

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

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

不确定这是否是确保注册使用 3rd 方 dll 的常见许可/激活方法,所以如果是的话,我会在此处为谷歌发布。

【讨论】:

5年后,这仍然是根本原因。【参考方案3】:

这在 app.config 文件中允许来自远程源的“插件”dll。

<configuration>
   <runtime>
      <loadFromRemoteSources enabled="true"/>
   </runtime>
</configuration>

http://msdn.microsoft.com/en-us/library/dd409252.aspx

【讨论】:

【参考方案4】:

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

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

如果我们偶然发现了动态程序集,则对 GetManifestResourceStream 的调用将失败,并出现“动态程序集不支持调用的成员”错误。

【讨论】:

【参考方案5】:

我花了很多时间来解决这个问题。

我们正在加载另一个Class Library 项目的DLL,该项目又会在运行中创建实例。所以下面对我有用。

解决方案:

DLL 的引用添加到主项目。

【讨论】:

以上是关于加载插件 DLL 文件,“动态程序集中不支持调用的成员。”的主要内容,如果未能解决你的问题,请参考以下文章

LUA 如何调用DLL插件啊。

分析加载动态 DLL 的 .NET 应用程序

C#WinForm程序设计中如何调用一些dll插件的事件?(急,如果问题不清晰,请进!)

使用 C++ 应用程序加载 dll

Wpf在运行时加载dll

处理 QPluginLoader::load() 抛出的异常