Как стать автором
Обновить

regsrv32.exe на .NET / Register COM server from .NET

Время на прочтение 2 мин
Количество просмотров 1.3K
Проблема была такая:
У клиента была необходимость переключаться между двумя версиями приложения, которое использует около 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);
}
Теги:
Хабы:
+1
Комментарии 23
Комментарии Комментарии 23

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн