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

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

无法从程序集’SquidReports.DataCollector.Plugin.BES,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’加载类型’Action’。

这是我正在使用的确切方法签名: 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’可以是以下任一种:程序集的简单名称,没有其路径或文件扩展名。

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

  • 已签名程序集的全名,包括其简单名称,版本,区域性和公钥标记; 例如,“TypeExtensions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 181869f2f7435b51”。

具体来说,我正在尝试创建一个在程序集’SquidReports.DataCollector.Plugin.BES’中定义的类’Action’的实例。 我明确地将此程序集引用为完全相同* .cs文件顶部的using指令,我正在尝试创建该实例。

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

清理你的解决方案,重建并再试一次这似乎适用于一些ASP.NET项目,但这是一个简单的旧控制台应用程序。

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

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

我们到了…

它就在那里!

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

对…

看起来一样

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

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

嗯...

我看了看两个日志。

这个命名短的版本确实会产生一些警告:

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

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

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

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

警告:这可能导致活页夹加载错误的程序集。

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

警告:它由简单的名称,版本,文化和公钥令牌组成。

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

…但它以成功加载结束,它清楚地提到我的assembly在正确的位置:

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

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

还有什么想法吗?

编辑 :这是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; } } 

ICollectible接口和[Key]属性是另一个程序集的一部分。 不确定这是否有效?

编辑2:正如Erik在下面指出的那样,显然我也对这个OTHER组件进行了完全相同的检查。

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