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

时间:2015-03-05 22:33:30

标签: c# reflection .net-assembly assembly-loading

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

  

无法加载类型'操作'从装配   ' SquidReports.DataCollector.Plugin.BES,Version = 1.0.0.0,   Culture = neutral,PublicKeyToken = null'。

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

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

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

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

  

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

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

  •   
  • 已签名程序集的全名,即   由简单的名称,版本,文化和公钥令牌组成;   例如," TypeExtensions,Version = 1.0.0.0,Culture = neutral,   公钥= 181869f2f7435b51"

  •   

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

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

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

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

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

我们在这......

It's right there!!!

2。确保程序集在磁盘上的版本相同

...烨

Looks the same

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

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

Hmmm...

我看了两个日志。

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

  

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

     

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程序集进行了完全相同的检查。

1 个答案:

答案 0 :(得分:10)

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