Activator.CreateInstance:无法从程序集中加载类型

2023-12-30

我正在尝试创建在我的项目中的插件 .dll 中实现的类的实例来进行类型发现。我收到这个异常:

无法从程序集中加载类型“Action” 'SquidReports.DataCollector.Plugin.BES,版本=1.0.0.0, 文化=中立,PublicKeyToken=null'。

这是我正在使用的确切方法签名:https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx

换句话说,我尝试根据程序集名称和类名称生成对象,如下所示:

object modelObject = Activator.CreateInstance((string)modelInfo.AssemblyName, (string)modelInfo.ModelName);

这里需要注意的一个重要部分是,我使用的是程序集的“短”名称,而不是“完整”名称(包括 Version、Culture 和 PublicToken)。 然而MSDN明确指出:

'AssemblyName' 可以是以下任意一项: 程序的简单名称 程序集,没有其路径或文件扩展名。

  • 例如,你会 为路径和名称为的程序集指定 TypeExtensions .\bin\TypeExtensions.dll。

  • 已签名程序集的全名,其中 由其简单名称、版本、文化和公钥令牌组成; 例如,“TypeExtensions,版本=1.0.0.0,文化=中性, 公钥令牌 = 181869f2f7435b51”。

具体来说,我试图创建程序集“SquidReports.DataCollector.Plugin.BES”中定义的类“Action”的实例。 我明确将此程序集引用为using指令位于我尝试创建实例的完全相同的 *.cs 文件的顶部。

我已经尝试了之前的问题/答案中的以下建议:

清理您的解决方案,重建并重试 这似乎适用于某些 ASP.NET 项目,但这是普通的旧控制台应用程序。

检查配置文件中引用的程序集 同样,这是一个简单的控制台应用程序,仅在同一解决方案的不同项目中使用 GAC 和库

1. 确保程序集位于正确的工作目录中:

我们到了...

2. 确保程序集与磁盘上的版本相同

Yup...

3.最终建议使用fuslogvw.exe。

我没有使用该工具的经验,但我确实发现了一件事很奇怪。运行调试会话后,我的程序集的长命名和短命名版本都出现了:

我查看了两个日志。

简称版本似乎确实产生了一些警告:

===预绑定状态信息===

日志: DisplayName = SquidReports.DataCollector.Plugin.BES 部分) WRN:为程序集提供了部分绑定信息:

警告:程序集名称:SquidReports.DataCollector.Plugin.BES |域ID:1

警告:当仅提供部分程序集显示名称时,会发生部分绑定。

警告:这可能会导致活页夹加载不正确的程序集。

WRN:建议为程序集提供完全指定的文本标识,

WRN:由简单名称、版本、区域性和公钥令牌组成。

警告:请参阅白皮书http://go.microsoft.com/fwlink/?LinkId=109270 http://go.microsoft.com/fwlink/?LinkId=109270了解更多信息和此问题的常见解决方案。

...但它以成功加载而结束,并且它清楚地提到了我在正确位置的程序集:

日志:尝试下载新的 URL 文件:///C:/Source/C#/SquidReports/SquidReports.DataCollector/bin/x86/Debug/SquidReports.DataCollector.Plugin.BES.DLL。

长命名版本的日志不包含可疑消息。

还有更多想法吗?

EDIT:这是 Action 类的最小定义。它纯粹是一个模型类。

public class Action : ICollectible
{
    public Action()
    {
        // Empty constructor
    }

    public Action(int actionID, string siteID, string name)
    {
        this.ActionID = actionID;
        this.SiteID = siteID;
        this.Name = name;
    }

    public int ID           { get; set; }   // Identity ID assigned by DB
    [Key]
    public int ActionID     { get; set; }   // Identity ID assigned by API
    public string SiteID    { get; set; }
    public string Name      { get; set; }
}

ICollectionible 接口和 [Key] 属性是另一个程序集的一部分。不知道这样有效果吗?

EDIT 2:正如埃里克(Erik)在下面指出的那样,显然我也对这个其他程序集进行了完全相同的检查。


正如您所发现的,正在加载程序集,它只是找不到类型(Action)。您必须指定类型的全名,Namespace.Action让 .NET 找到它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Activator.CreateInstance:无法从程序集中加载类型 的相关文章

随机推荐