COM组件创建interop程序集

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;
using System.Reflection;
using System.Runtime.InteropServices;
namespace Interop
{
    class Program
    {
        enum RegType
        {
            RegKind_Default=0,
            RegKind_Register=1,
            RegKind_Nonepri=2
        }
        [DllImport("oleaut32.dll",CharSet=CharSet.Unicode,PreserveSig=false)]
        private static extern void LoadTypeLibEx(string strTypeLibName, RegType regkind, [MarshalAs(UnmanagedType.Interface)]out object typeLib);
        static void Main(string[] args)
        {
            //net 2.0页面309
            CreateCOMInterop("SHDocVw.dll");
            Console.ReadKey();
        }
        static void CreateCOMInterop(string NameOFCOMComponent)
        {
            string interopAssemblyFile;
            object myTypeLibrary = new object();
            TypeLibConverter converter = new TypeLibConverter();
            ConversionEventHandler eventHandler = new ConversionEventHandler();
            AssemblyBuilder interopBuilder;
            try 
            {
                LoadTypeLibEx(NameOFCOMComponent, RegType.RegKind_Register, out myTypeLibrary);
                if (myTypeLibrary == null)
                {
                    Console.WriteLine("创建失败!{0}",NameOFCOMComponent);
                    return;
                }

                //object typeLib, string asmFileName, TypeLibImporterFlags flags, ITypeLibImporterNotifySink notifySink, byte[] publicKey, StrongNameKeyPair keyPair, string asmNamespace, Version asmVersion
                interopBuilder = converter.ConvertTypeLibToAssembly(myTypeLibrary,NameOFCOMComponent,0,eventHandler,null,null,null,null);
                interopAssemblyFile = "Interop_" + NameOFCOMComponent;
                interopBuilder.Save(interopAssemblyFile);
                Console.WriteLine("成功");
            }
            catch
            { }
            
        }
    }
    public class ConversionEventHandler : ITypeLibImporterNotifySink
    {

      public   void ReportEvent(ImporterEventKind eventKind, int eventCode, string eventMsg)
        {
            Console.WriteLine(eventMsg.ToString());
        }

      public Assembly ResolveRef(object typeLib)
        {
            Console.WriteLine("");
            return null;
        }
    }
}

 

posted on 2012-11-01 22:34  R.Ray  阅读(333)  评论(0)    收藏  举报

导航