/// <summary> /// Creates COM class instance directly without using any COM Activation or thread Marshaling services. /// </summary> /// <param name="libraryModule"></param> /// <param name="clsid"></param> /// <returns></returns> public static object DangerousCreateInstanceDirectly(NRegFreeCom.IAssembly libraryModule, Guid clsid) { var classFactory = GetClassFactory(libraryModule, clsid); var iid = new Guid(WELL_KNOWN_IIDS.IID_IUnknown); object obj; classFactory.CreateInstance(IntPtr.Zero, ref iid, out obj); return obj; }
/// <seealso href="https://gist.github.com/1568627/76da6e65a2d925fffdb48a0ae5efd783281f9244"/> private static IClassFactory_AutoMarshal GetClassFactory(NRegFreeCom.IAssembly libraryModule, Guid clsid) { var getClassFactory = libraryModule.GetDelegate<DEF_Objbase.DllGetClassObject>(); var classFactoryIid = new Guid(WELL_KNOWN_IIDS.IID_IClassFactory); IClassFactory_AutoMarshal classFactory; var hresult = getClassFactory(ref clsid, ref classFactoryIid, out classFactory); if (hresult != 0) { throw new Win32Exception(hresult, string.Concat("Cannot create class factory for {0}", clsid)); } return classFactory; }