簡體   English   中英

Activator.CreateInstance:無法從程序集加載類型

[英]Activator.CreateInstance: Could not load type from assembly

我正在嘗試在我的項目中創建一個在插件.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

...但它以成功加載結束,它清楚地提到我的裝配在正確的位置:

日志:嘗試下載新的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才能找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM