The dotPeek disassembles Interop DLLs incorrectly
The scenario is disassembling a interop DLL produced by .Net v4.0 (VS2010) tlbimp from TLB generated based on IDL.
The IDL:
interface ITargetX : IUnknown
{
HRESULT Create([in] LPPROGRAMCONTROLLER pProgramController, [in] LPPROGRAMAGENT pProgramAgent);
HRESULT Run([in, unique] BSTR bstrTargetRunInput, [out] BSTR* bstrTargetRunOutput);
HRESULT RunInTrain([in, unique] BSTR bstrTargetRunInput, [out] BSTR* bstrTargetRunOutput);
};
cpp_quote("////////////////////////////////////////////////////////////////////////////////////////")
cpp_quote("// Target DUMMY ")
cpp_quote("")
cpp_quote("// CLSID definition for OLE_CREATE macro")
cpp_quote("#define CLSID_OC_TargetDummy {0xAAAAAAA, 0xAAAA, 0xAAAA, {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}}")
cpp_quote("////////////////////////////////////////////////////////////////////////////////////////")
[
uuid(AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA),
helpstring("TargetDummy Class")
]
coclass TargetDummy
{
[default] interface ITargetX;
};
The code generated from interop DLL by dotPeek:
[Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")]
[TypeLibType(TypeLibTypeFlags.FCanCreate)]
[ClassInterface(ClassInterfaceType.None)]
[ComImport]
public class TargetDummyClass : ITargetRun, TargetDummy
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public TargetDummyClass();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public virtual void Create([ComAliasName("Mynamespace"), MarshalAs(UnmanagedType.Interface), In] IProgramController pProgramController, [ComAliasName("Mynamespace"), MarshalAs(UnmanagedType.Interface), In] IProgramAgent pProgramAgent);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public virtual void Run([MarshalAs(UnmanagedType.BStr), In] string bstrTargetRunInput, [MarshalAs(UnmanagedType.BStr)] out string bstrTargetRunOutput);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public virtual void RunInTrain([MarshalAs(UnmanagedType.BStr), In] string bstrTargetRunInput, [MarshalAs(UnmanagedType.BStr)] out string bstrTargetRunOutput);
}
This obviously does not compile.
However, same interop disassembled by .NetReflector 8 looks and compiles OK:
[ComImport, Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"), CoClass(typeof(TargetDummyClass))]
public interface TargetDummy : ITargetX
{
}
As you can see a lot of unneeded code added, also the flags looks really wrong .
Please sign in to leave a comment.