2011-06-15 27 views
9

完整的異常詳細信息如下:幫助需要與TypeAccessException:嘗試通過方法...訪問類型...失敗

System.TypeAccessException occurred 
    Message=Attempt by method 'DynamicClass.(System.Text.StringBuilder, System.Object, Int32)' to access type 'System.Collections.Generic.IEnumerable`1<System.Collections.Generic.KeyValuePair`2<System.Object,NetworkCatcher.Entities.Server.CalculatedFCStateManager+Descriptor>>' failed. 
    Source=Anonymously Hosted DynamicMethods Assembly 
    TypeName="" 
    StackTrace: 
     at (StringBuilder , Object , Int32) 
    InnerException: 

方法名DynamicClass.(System.Text.StringBuilder, System.Object, Int32)對應於這種動態生成的方法:

private delegate StringBuilder AppendToStringBuilderDelegate(StringBuilder sb, object obj, int maxItemsToDisplay); 

private static AppendToStringBuilderDelegate EmitDelegate(Type type, MethodInfo methodInfo) 
{ 
    var dynamicMethod = new DynamicMethod(string.Empty, typeof(StringBuilder), TypeArray<StringBuilder, object, int>.Value); 
    var parameters = methodInfo.GetParameters(); 

    var il = dynamicMethod.GetILGenerator(); 
    il.Emit(OpCodes.Ldarg_0); 
    il.Emit(OpCodes.Ldarg_1); 
    il.Emit(OpCodes.Unbox_Any, parameters[1].ParameterType); 
    il.Emit(OpCodes.Ldarg_2); 
    il.EmitCall(OpCodes.Call, methodInfo, null); 
    il.Emit(OpCodes.Ret); 
    return s_methodCache[type] = (AppendToStringBuilderDelegate)dynamicMethod.CreateDelegate(typeof(AppendToStringBuilderDelegate)); 
} 

堆棧跟蹤爲:

[Lightweight Function] 
Shunra.Common.dll!Shunra.Common.DebugUtils.AppendObject<System.Collections.Generic.IDictionary<object,NetworkCatcher.Entities.Server.CalculatedFCStateManager.Descriptor>>(System.Text.StringBuilder sb, System.Collections.Generic.IDictionary<object,NetworkCatcher.Entities.Server.CalculatedFCStateManager.Descriptor> obj, int maxItemsToDisplay) Line 261 + 0x14 bytes C# 
Shunra.Common.dll!Shunra.Common.DebugUtils.ToString<System.Collections.Generic.IDictionary<object,NetworkCatcher.Entities.Server.CalculatedFCStateManager.Descriptor>>(System.Collections.Generic.IDictionary<object,NetworkCatcher.Entities.Server.CalculatedFCStateManager.Descriptor> obj, int maxItemsToDisplay) Line 435 + 0x4d bytes C# 
NC.Entities.Server.dll!NetworkCatcher.Entities.Server.CalculatedFCStateManager.Populate() Line 98 + 0x2c bytes C# 
NC.Entities.Server.dll!NetworkCatcher.Entities.Server.RunManager.Initialize() Line 500 + 0x1c bytes C# 
NC.Entities.Server.dll!NetworkCatcher.Entities.Server.EntryPoint.OnStart() Line 63 + 0x5 bytes C# 
Shunra.Infra.dll!Shunra.Infra.EntryPoint.Start() Line 37 + 0xb bytes C# 
Shunra.Common.dll!Shunra.Common.Wcf.ShunraServiceHost.OnOpening() Line 47 + 0x11 bytes C# 
System.ServiceModel.dll!System.ServiceModel.Channels.CommunicationObject.Open(System.TimeSpan timeout) + 0x113 bytes  
System.ServiceModel.dll!System.ServiceModel.Channels.CommunicationObject.Open() + 0x25 bytes  
NC.Server.Host.exe!NetworkCatcher.Server.Host.NCServerInstance.StartHosts() + 0xef bytes  
Shunra.Common.dll!Shunra.Common.Wcf.ShunraServerInstance<NetworkCatcher.Server.Host.NCServerInstance,NetworkCatcher.Server.Host.ServerHost>.Run() Line 357 + 0xb bytes C# 
NC.Server.Host.exe!NetworkCatcher.Server.Host.Program.Main(string[] args) + 0x84 bytes 

最後,兩個組件 - Shunra公司。 Common.dll和NC.Entities.Server.dll屬於相同的代碼庫。 NC.Entities.Server.dll從位於根文件夾下的私人bin文件夾中加載,Shunra.Common.dll位於該文件夾下。

一切正常,直到我決定在另一個帳戶下運行代碼。因此,我創建了一個新帳戶,並將其設爲管理員,並在此帳戶下打開了一個提升的控制檯窗口。 該帳戶可以訪問所有文件。不過,當我運行應用程序時,我得到這個錯誤,我完全迷失了。

任何想法?

謝謝。

回答

0

您可以通過運行fuslogvw(Fusion Log Viewer)瞭解更多信息。如果您對此不熟悉,它可以讓您記錄所有綁定並嘗試綁定到.NET程序集 - 它會告訴您探測到的所有路徑以查找程序集,並可能爲您提供綁定失敗的更多原因。如果你熟悉它,你可以忽略我必須說的其餘部分!

如果它不是一個綁定失敗,至少你已經消除了一種可能性。

要從Visual Studio cmmand提示符運行查看器fuslogvw,並將設置從禁用日誌更改爲將綁定失敗記錄到磁盤或將所有綁定到磁盤(根據首選項)。再次運行您的代碼並單擊刷新。雙擊一個條目以查看詳細信息。

確保您在完成時禁用日誌 - fuslogvw正在監控綁定跨所有進程,並且如果讓它運行您的計算機將會1)變慢,2)填滿日誌。

+0

OK,我跑fuslogvw都與日誌結合的失敗,並日志所有。沒有看到任何不尋常的東西,但如果你有任何具體的內容 - 請告訴我要發佈什麼,我會。 – mark 2011-06-15 10:52:13

+0

沒有比查看應用程序的任何綁定失敗更具體的事情 - 但是您必須雙擊主窗口中的條目以查看每個綁定的詳細信息。否則我也相當難過。 – Cyberycon 2011-06-15 16:12:12

11

我最近有類似的問題,事實證明,我調用的類型(即MethodInfo.DeclaringType)是內部的。將其設置爲public後,類型訪問成功。

+3

如果在實例化DynamicMethod時使用參數'restrictedSkipVisibility:true',則此可見性問題也可以修復。調用程序集和您訪問的類型之間的信任級別應該兼容,但值得一試。 – 2013-05-17 13:49:22

0

我有一個類似的異常,異常的症狀圍繞委託類型進行,並在我的Moq類中使用CallBase = true。

對我來說,解決這個問題的方法是將代表公開在範圍內,這樣通過Moq就可以看到它。我們最初將代表作爲受保護的範圍,並且我收到了此異常,因此似乎需要公共範圍。

在原來的問題的情況下,我認爲你需要改變

private delegate StringBuilder AppendToStringBuilderDelegate(StringBuilder sb, object obj, int maxItemsToDisplay); 

public delegate StringBuilder AppendToStringBuilderDelegate(StringBuilder sb, object obj, int maxItemsToDisplay); 
相關問題