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;
}
}
}