Пример #1
0
        static void Main(string[] args)
        {
            var p = new Program();



            var loader = new AssemblySystem();


            var module = loader.LoadFrom(loader.GetAnyCpuPath(loader.BaseDirectory), "RegFreeComNativeConsumer.dll");

            //call dll entry point if needed -
            //var main = module.GetDelegate<DEF.DllMain>();//enty point is not declared as export
            //bool result = main(module.Handle, FDW_REASONS.DLL_PROCESS_ATTACH, IntPtr.Zero);
            //if (!result) throw new Exception("Failed to init dll");

            // push managed COM service into native method
            _service = new RegFreeSimpleObject();
            _service.FloatProperty = 42;
            _pointer = Marshal.GetIUnknownForObject(_service);
            var initialize = module.GetDelegate <Initialize>();
            int error      = initialize(_pointer);

            if (error != 0)
            {
                throw new Exception();
            }

            EnsureGC();
            _service.RaiseEnsureGCIsNotObstacle();

            // return string from C

            IntPtr strPtr = IntPtr.Zero;

            module.GetDelegate <GetStringResult>()(out strPtr);
            var str = Marshal.PtrToStringUni(strPtr);

            Marshal.FreeBSTR(strPtr);
            Console.WriteLine(str);

            // return array of COM services which return pointers
            var com            = loader.LoadFrom(loader.GetAnyCpuPath(loader.BaseDirectory), "RegFreeComNativeImplementer");
            var servicesGetter = com.GetDelegate <GetComInterface>();

            object[] services;
            servicesGetter(out services);
            var    srv = (RegFreeComNativeInterfacesLib.IMyService)services[0];
            IntPtr otherHandle;

            srv.GetSomeHanlde(out otherHandle);
            var srvRepeat = (RegFreeComNativeInterfacesLib.IMyService)Marshal.GetObjectForIUnknown(otherHandle);

            // pointer to itself was used to simplify testing
            Assert.AreEqual(services[0], srvRepeat);

            Console.ReadKey();
        }
Пример #2
0
        static void Main(string[] args)
        {
            var p = new Program();

            var loader = new AssemblySystem();

            var module = loader.LoadFrom(loader.GetAnyCpuPath(loader.BaseDirectory), "RegFreeComNativeConsumer.dll");

            //call dll entry point if needed -
            //var main = module.GetDelegate<DEF.DllMain>();//enty point is not declared as export
            //bool result = main(module.Handle, FDW_REASONS.DLL_PROCESS_ATTACH, IntPtr.Zero);
            //if (!result) throw new Exception("Failed to init dll");

            // push managed COM service into native method
            _service = new RegFreeSimpleObject();
            _service.FloatProperty = 42;
            _pointer = Marshal.GetIUnknownForObject(_service);
            var initialize = module.GetDelegate<Initialize>();
            int error = initialize(_pointer);
            if (error != 0) throw new Exception();

            EnsureGC();
            _service.RaiseEnsureGCIsNotObstacle();

            // return string from C

            IntPtr strPtr = IntPtr.Zero;
            module.GetDelegate<GetStringResult>()(out strPtr);
            var str = Marshal.PtrToStringUni(strPtr);
            Marshal.FreeBSTR(strPtr);
            Console.WriteLine(str);

            // return array of COM services which return pointers
            var com = loader.LoadFrom(loader.GetAnyCpuPath(loader.BaseDirectory), "RegFreeComNativeImplementer");
            var servicesGetter = com.GetDelegate<GetComInterface>();
            object[] services;
            servicesGetter(out services);
            var srv = (RegFreeComNativeInterfacesLib.IMyService) services[0];
            IntPtr otherHandle;
            srv.GetSomeHanlde(out otherHandle);
            var srvRepeat = (RegFreeComNativeInterfacesLib.IMyService)Marshal.GetObjectForIUnknown(otherHandle);
            // pointer to itself was used to simplify testing
            Assert.AreEqual(services[0],srvRepeat);

            Console.ReadKey();
        }