Проблема была такая:
У клиента была необходимость переключаться между двумя версиями приложения, которое использует около 1000 com объектов.
Чтобы переключиться надо сделать unreg всем dll первой версии и reg всем dll второй версии… Потом, когда понадобится снова перейти на первую версию, повторить процесс в обратном направлении…
Можно запускать много раз regsrv32.exe, однако, это долго и нетру :) (для каждой dll будет запущенно аж по 2 процесса, на рег и на анрег)…
Поэтому и был написан следующий код. Большой ценности он не представляет, но т.к. поиск в google про реализацию регистрации com сервера на .NET ничего похожего не дал, то привожу его здесь для индексирования и использования теми, кому вдруг надо :)
У клиента была необходимость переключаться между двумя версиями приложения, которое использует около 1000 com объектов.
Чтобы переключиться надо сделать unreg всем dll первой версии и reg всем dll второй версии… Потом, когда понадобится снова перейти на первую версию, повторить процесс в обратном направлении…
Можно запускать много раз regsrv32.exe, однако, это долго и нетру :) (для каждой dll будет запущенно аж по 2 процесса, на рег и на анрег)…
Поэтому и был написан следующий код. Большой ценности он не представляет, но т.к. поиск в google про реализацию регистрации com сервера на .NET ничего похожего не дал, то привожу его здесь для индексирования и использования теми, кому вдруг надо :)
// 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);
}