加载插件 DLL 文件,"The invoked member is not supported in a dynamic assembly."



我们有自定义DLL,这些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) {}

发生此错误是因为无法在动态程序集上调用Assembly.Load。在使用动态程序集之前,必须筛选出动态程序集。

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

对我来说,

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

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

不确定这是否是确保注册使用第三方 dll 的常见许可/激活方法,因此如果是,我会将其发布在这里供谷歌使用。

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

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

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

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

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

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

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

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

溶液:

DLL的引用添加到主项目。

相关内容

  • 没有找到相关文章

最新更新