2012-11-21 110 views
1

我收到一個ArgumentException「對象類型不能轉換爲目標類型」,但它對我來說沒有任何意義。 You can see the exception in this image廢話爭論異常調用方法

的方法我打電話有以下特徵:

public void Scan(IProgressStatus monitor, string registryPath, string startupDir, string addinsDir, string databaseDir, string scanFolder, string[] filesToIgnore) 

我試圖通過monitor而不是remMonitor但異常仍然拋出。 除了scanFolder之外的所有參數都爲null(但是傳遞的字符串.Empty仍會拋出異常),並且filesToIgnore是零長度數組。

我找不出爲什麼拋出異常。

不知道它是否有幫助,但過程是64位。如果我從32位進程調用相同的方法,則不會引發異常並且運行良好。

[編輯]如果我通過null而不是remMonitor它會進入方法。

[編輯2]調試更深我發現一些奇怪的東西。我試着箱拆箱參數:

rsd.Scan((object)remMonitor, registry.RegistryPath, registry.StartupDirectory, registry.DefaultAddinsFolder, registry.AddinCachePath, scanFolder, filesToIgnore); 

public void Scan(object monitor, string registryPath, string startupDir, string addinsDir, string databaseDir, string scanFolder, string[] filesToIgnore) 
{ 
    monitor = (IProgressStatus)monitor; 

結果是:

?(IProgressStatus)monitor 
Cannot cast 'monitor' (which has an actual type of 'System.Runtime.Remoting.Proxies.__TransparentProxy') to 'Mono.Addins.IProgressStatus' 

它看起來像顯示器實際上有不兼容的類型,現在問題是爲什麼?

[EDIT3]好,我已經成功地明白,這是一個DllHell負載方面的問題,我已經將在Visual Studio中所有的異常轉彎,它說,Mono.Addins是在LoadFrom上下文負載。但是,如果我編寫指令Assembly.Load("Mono.Addins");,則會引發相同的警告(從LoadFrom上下文加載)。一些提示?

+2

我想問題是在掃描方法。這是你自己寫的一種方法嗎?這可能是由於一些反射錯誤 – Kek

+0

如果我按下「步入」異常在它進入方法體內部之前被拋出,所以我認爲問題在參數類型的某處。我不寫我自己的方法,這是mono.addins源代碼:http://monoaddins.codeplex.com/releases/view/96359 –

+0

你有沒有嘗試過查看異常的StackTrace? – dtb

回答

0

最後,我已經成功地解決我的問題:

寫在EDIT3這是一個負載情況下的問題,this blog解釋相當不錯每種方法的裝載行爲。

因此到this hint我已經手動加載使用組件:

 System.Reflection.AssemblyName an = new System.Reflection.AssemblyName(); 
     an.Name = "Mono.Addins"; 
     an.Version = new System.Version(1, 0, 0); 
     System.Reflection.Assembly.Load(an); 

然後我已經放置在AutoCAD.exe路內的右組件Mono.Addins.dll(就是ApplicationBase我的應用程序)。本來我認爲ApplicationBase是相同的調用程序集路徑,但不是,FYI發現我已經使用的應用程序的基本路徑System.AppDomain.CurrentDomain.BaseDirectory;

0

找到這種過度的谷歌組,並且它提到的相同的方法相同的異常:

https://groups.google.com/forum/#!msg/mono-addins/f4SzNPtcRIg/ma9EPEzGdagJ

在SetupDomain.cs:掃描()有它讀取行:RSD .Scan (remMonitor,registryPath,startupDir,scanFolder,filesToIgnore);

如果我進入這種方法,我不採取Scan()方法,但 而不是RemoteProgressStatus:InitializeLifetimeService(),它返回 null。從該方法返回後,拋出異常。

這是一個已知的問題,也許是解決辦法?謝謝!

System.ArgumentException發生消息=「對象類型不能 轉換爲目標類型」。 Source =「Mono.Addins」StackTrace: at Mono.Addins.Database.RemoteSetupDomain。掃描(IProgressStatus監視器,字符串registryPath,字符串startupDir,字符串scanFolder, 字符串[] filesToIgnore) 在Mono.Addins.Database.SetupDomain.Scan(IProgressStatus監視器,字符串registryPath,字符串startupDir,字符串scanFolder, 字符串[] filesToIgnore)在C:\用戶\基爾\項目\ Mono.Addins \ Mono.Addins \ Mono.Addins.Database \ SetupDomain.cs:線43
的InnerException:

解決方案:

我移動AddinManager.Initialize ();和 AddinManager.Registry.Update(null);到標記爲 [ClassInitialize]的方法與試圖在構造函數中執行此操作的方法以及 事情再次感到滿意。

+0

沒有運氣,還是一樣的錯誤。我的項目不是一個測試項目,所以對於普通項目可能類似[ClassInitialize]應該起作用?我不知道ClassInitialize是什麼 –