加载插件 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 文件,“动态程序集中不支持调用的成员。”的主要内容,如果未能解决你的问题,请参考以下文章