private static uint appId = 0;
private static void RegisterServerImp(Guid clsid)

{
IntPtr pCF;
Guid IID_IClassFactory = new Guid(0x00000001, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
uint CLSCTX_LOCAL_SERVER = 4;
uint REGCLS_SINGLEUSE = 0;
int hr; 
hr = DllGetClassObject(ref clsid, ref IID_IClassFactory, out pCF);
if (hr < 0)
{
throw new COMException("DLLGetClassObject failed.", hr);
} 
hr = CoRegisterClassObject(ref clsid, pCF, CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, out appId);
if (hr < 0)
{
throw new COMException("CoRegisterClassObject failed.", hr);
}
} 
private static void UnRegisterServerImp(uint appId)

{
CoRevokeClassObject(appId);
} 

3. 将Winform程序的COM对象加入系统的ROT表中
加入ROT表有很多办法,可以通过取得系统IRunningObjectTable接口来直接注册也可以使用OLE的API RegisterActiveObject来实现,这里由于没有特殊要求,我们使用后者来实现。
//define static object to keep COM object alive in whole application lifecycle.
private static ProviderImp msProvider = new ProviderImp();
private static int dwRegister = 0;
public static void RegisterActiveObject()

{
Guid clsidProviderImp = typeof(ProviderImp).GUID;
int hr = RegisterActiveObject(msProvider, ref clsidProviderImp, 0, out dwRegister);
} 
public static void RevokeActiveObject()

{
RevokeActiveObject(dwRegister, IntPtr.Zero);
} 

附录:
1.相关API的PInvoke定义:
[DllImport("Ole32.Dll")]
public static extern int CreateBindCtx(int reserved,out IBindCtx bindCtx); 
[DllImport("oleaut32.dll")]
private static extern int RegisterActiveObject([MarshalAs(UnmanagedType.IUnknown)] object pUnk, ref Guid rclsid, uint dwFlags, out int pdwRegister); 
[DllImport("oleaut32.dll")]
private static extern uint GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [Out]out IntPtr ppunk); 
[DllImport("oleaut32.dll")]
private static extern uint RevokeActiveObject(int dwRegister, IntPtr lpReserved); 
//from www.pinvoke.net
[DllImport(/**//*NOXLATE*/"ole32.dll")]
private static extern int CoRegisterClassObject(
[In] ref Guid rclsid,
IntPtr pUnk,
uint dwClsContext,
uint flags,
out uint lpdwRegister); 
[DllImport("ole32.dll")]
private static extern int CoRevokeClassObject(uint dwRegister); 

[DllImport(/**//*NOXLATE*/"mscoree.dll", ExactSpelling = true)]
private static extern int DllGetClassObject(
ref Guid rclsid,
ref Guid riid,
out IntPtr ppv);


