我有一個很奇怪的問題。我在DLL中定義的接口如下:我得到「非抽象的,非接口的.cctor-方法」的原因是什麼?
public interface IKreator2
{
string Name { get; set; }
string Description { get; set; }
INotifyPropertyChanged Settings { get; set; }
InfiniRenderJob Job { get; set; }
UserControl UI { get; set; }
void Init();
//void OnClose();
}
如果我鏈接的DLL在我的WPF應用程序上負載調試器崩潰(內部錯誤:未處理的異常在調試器:: HandleIPCEvent,ID = 0x246) 。如果我與調試「調試非託管代碼」的應用程序,我得到了以下錯誤:
- 第一次機會異常在0x76977945(KernelBase.dll)在 InfiniRender.Host.exe:微軟C++異常:在內存EETypeLoadException 位置0x0029c5b8。
- 0x76977945(KernelBase.dll)中的第一次機會異常 InfiniRender.Host.exe:Microsoft C++異常:[rethrow]在內存 位置0x00000000。
- YPE 'System.TypeLoadException' 的第一次機會異常發生 在InfiniRender.Host.exe
- 類型 'System.TypeLoadException' 的未處理的異常發生在 InfiniRender.Host.exe其他信息:Nicht abstrakte Nicht -ector-Methode in einer Schnittstelle。
在這一刻我絕對沒有線索發生了什麼事情。甚至沒有接口的實現,沒有類使用它。如果我將方法「Init」評論出來,一切都按預期工作。 任何想法??
[編輯] 這是MSIL的接口init方法:
.method public hidebysig newslot virtual
instance void Init() cil managed
{
// Code size 96 (0x60)
.maxstack 3
.locals init ([0] class [mscorlib]System.Exception CS$0$0__ex)
IL_0000: ldsfld class [NLog]NLog.Logger '<>z__LoggingImplementationDetails'::l14
IL_0005: callvirt instance bool [NLog]NLog.Logger::get_IsTraceEnabled()
IL_000a: brfalse.s IL_001b
IL_000c: ldsfld class [NLog]NLog.Logger '<>z__LoggingImplementationDetails'::l14
IL_0011: ldstr "Entering: InfiniRender.IKreator2.Init()"
IL_0016: call instance void [NLog]NLog.Logger::Trace(string)
.try
{
IL_001b: newobj instance void [mscorlib]System.NotSupportedException::.ctor()
IL_0020: throw
IL_0021: ldsfld class [NLog]NLog.Logger '<>z__LoggingImplementationDetails'::l14
IL_0026: callvirt instance bool [NLog]NLog.Logger::get_IsTraceEnabled()
IL_002b: brfalse.s IL_003c
IL_002d: ldsfld class [NLog]NLog.Logger '<>z__LoggingImplementationDetails'::l14
IL_0032: ldstr "Leaving: InfiniRender.IKreator2.Init()"
IL_0037: call instance void [NLog]NLog.Logger::Trace(string)
IL_003c: leave.s IL_005f
} // end .try
catch [mscorlib]System.Exception
{
IL_003e: ldsfld class [NLog]NLog.Logger '<>z__LoggingImplementationDetails'::l14
IL_0043: callvirt instance bool [NLog]NLog.Logger::get_IsWarnEnabled()
IL_0048: brfalse.s IL_005d
IL_004a: stloc.0
IL_004b: ldsfld class [NLog]NLog.Logger '<>z__LoggingImplementationDetails'::l14
IL_0050: ldstr "An exception occurred:\n{0}"
IL_0055: ldloc.0
IL_0056: call instance void [NLog]NLog.Logger::Warn(string,
object)
IL_005b: rethrow
IL_005d: leave.s IL_005f
} // end handler
IL_005f: ret
} // end of method IKreator2::Init
在我看來,那是NLOG怪誰呢?直到今天從來沒有任何問題與NLog ...
該接口的原始IL表示什麼? – thecoop 2012-07-20 11:59:46
可以在某處上傳repro嗎? – Simon 2012-07-20 12:15:07
你如何消耗這個接口?你的錯誤意味着一些非託管代碼。而且,'TypeLoadException'實例很可能不是由* interface *引起的,而是由* implements實現的接口。 – casperOne 2012-07-20 13:16:09