クライアントは、約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);
}