2013-07-26 25 views
1

我有一個生產中的用戶在嘗試從Outlook互操作程序集中獲取程序集類型時正在獲取ReflectionTypeLoadException。我需要編寫應用程序以更好地調試問題,但我無法重現他的問題,因此我無法測試代碼以確保它能夠提供我所需的內容。如何模擬ReflectionTypeLoadException?

我發現這個職位:Error message 'Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.'它有示例代碼,但我想通過它進行調試,以確保它適用於我,並看看它是如何工作的。

這是我的代碼拋出。我有實際的程序集加載。這是當我列舉包含在該類型我得到異常:

Type t = assembly.GetTypes().Where(x => x.IsClass && x.Name.Equals("ApplicationClass")).FirstOrDefault(); 

任何人都可以提供樣品或一些見解,我怎麼可以模擬這個問題,所以我可以證實,我需要編寫的代碼?

謝謝。

回答

0

在創建outlook類實例的時候,你有圍繞它的try塊來獲取堆棧跟蹤嗎?此外,該應用程序是否作爲客戶端應用程序運行?如果是這樣,用戶可能沒有安裝Outlook?

+0

我現在沒有try/catch。我需要添加一個,但我想專門記錄/跟蹤可以從ReflectionTypeLoadException收集的信息。由於我無法在我的機器上重現問題,因此無法評估我的代碼以確保捕獲我需要的內容,並且我也很好奇,因此請參閱此特定反射類型提供的內容。用戶確實已安裝Outlook。 – Ben

+0

看看這裏的屬性http://msdn.microsoft.com/en-us/library/system.reflection.reflectiontypeloadexception.aspx – christiandev

+0

我已經審查過所有這些。我可以編寫大量的代碼來從異常中提取所需的所有信息,但是我無法做的事實際上是觸發了其中一個例外,因此我可以驗證我的代碼。我無法重現這個問題,所以我正在尋找一種方法來做到這一點。我也沒有權限創建示例應用程序來測試我可以在用戶機器上運行的應用程序。我怎麼能創建一個有錯誤的程序集,從而調用GetTypes會引發這個異常。 – Ben

0

你應該能夠拋出ReflectionTypeLoadException並使用它來測試。顯然你應該爲你的特定情況提供一個更現實的例子,但是這將模擬該異常類型。

try 
{ 
    var test = 10; 
    throw new ReflectionTypeLoadException(new Type[] { test.GetType() }, new Exception[] { new FileNotFoundException() }); 
} 
catch (ReflectionTypeLoadException ex) 
{ 
    var whatIsTheException = ex; 
} 
+0

我可以做到這一點,但我想模擬一個真實的例子,其中ReflectionTypeLoadException作爲真正的異常而不是作爲生成的代碼引發。 – Ben

+0

在您試圖通過反射加載類型的類型的名稱中輸入一個拼寫錯誤。一種猜測是,它無法在類型加載器中找到您要查找的文件。 – cgotberg

1

今天我遇到了同樣的問題。這就是我想出的基礎上,在那裏我已經打過去這一個案件:

var assemblyName = new AssemblyName("TestAssembly"); 
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); 
var module = assemblyBuilder.DefineDynamicModule("MainModule"); 
var typeBuilder = module.DefineType(name: "TestType", attr: TypeAttributes.Public | TypeAttributes.Class); 
// uncommenting this stops the error. Basically, GetTypes() seems to fail if the ModuleBuilder 
// has an "unfinished" type 
//typeBuilder.CreateType(); 
module.Assembly.GetTypes(); 
1

看來的System.Reflection.Assembly所有公共成員都是虛擬的,所以這樣的事情可能會滿足你的目的:

public class DodgyAssembly : Assembly 
{ 
    public override Type[] GetTypes() 
    { 
     throw new ReflectionTypeLoadException(new [] { typeof(Foo) }, new [] { new Exception() }); 
    } 
} 

var assembly = new DodgyAssembly();