我正在尝试在我的项目中创建在插件 .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);
这里要注意的一个重要部分是,我使用的是程序集的“短”名称,而不是“全”名称(包括版本、文化和 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)警告:为程序集提供了部分绑定信息:
警告:程序集名称:SquidReports.DataCollector.Plugin.BES | 域 ID:1
警告:仅提供部分程序集显示名称时会发生部分绑定。
警告:这可能会导致活页夹加载不正确的程序集。
警告:建议为程序集提供完全指定的文本标识,
WRN:由简单的名称、版本、文化和公钥标记组成。
警告:有关此问题的详细信息和常见解决方案,请参阅白皮书http://go.microsoft.com/fwlink/?LinkId=109270。
...但它以成功加载而告终,并且清楚地提到了我在正确位置的程序集:
日志:正在尝试下载新的 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 程序集进行了完全相同的检查。