.NET上のregsrv32.exe / .NETからのCOMサーバーの登録

問題はこれでした:

クライアントは、約1000個のcomオブジェクトを使用する2つのバージョンのアプリケーションを切り替える必要がありました。

切り替えるには、最初のバージョンのすべてのdllを登録解除し、2番目のバージョンのすべてのdllを登録する必要があります...その後、最初のバージョンに再び切り替える必要がある場合は、反対方向にプロセスを繰り返します...

regsrv32.exeを何度も実行できますが、時間がかかります:)(各dllについて、regとanregの2つのプロセスが開始されます)...

そのため、次のコードが作成されました。 彼はあまり価値がありませんが、 .NETでのcomサーバーの登録の実装に関するgoogleでの検索では類似したものは何も得られなかったので、ここでインデックスに登録し、突然必要な人が使用できるようにします。



// regsrv32 .NET . register com server via .net

private void RegDll(string mDll) {

IntPtr pDll = NativeMethods.LoadLibrary(@"path_to_dll\your.dll");

if (pDll == IntPtr.Zero) {

//......

}



IntPtr pDllRegServ = NativeMethods.GetProcAddress(pDll, "DllRegisterServer");

IntPtr pDllUnRegServ = NativeMethods.GetProcAddress(pDll, "DllUnregisterServer");

// check ptrs for zero...



DllFuncServer reg =

(DllFuncServer) Marshal.GetDelegateForFunctionPointer(pDllRegServ, typeof(DllFuncServer));



DllFuncServer unReg =

(DllFuncServer)Marshal.GetDelegateForFunctionPointer(pDllUnRegServ, typeof(DllFuncServer));



int resUnreg = unReg();

int resReg = reg();

bool result = NativeMethods.FreeLibrary(pDll);

Console.Write(resUnreg + " " + resReg);

}



[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

private delegate int DllFuncServer();



static class NativeMethods {

[DllImport("kernel32.dll")]

public static extern IntPtr LoadLibrary(string dllToLoad);



[DllImport("kernel32.dll")]

public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);



[DllImport("kernel32.dll")]

public static extern bool FreeLibrary(IntPtr hModule);

}







All Articles