[英]How to load type from system dll using 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.