1. Приделываем к сборке пакет
UnmanagedExports
Конфигурируем платформу (32/64)
2. Пишем две функции.
— проверки по вкусу
— в моем случае мне нужно зарегистрировать библиотеку для пользователя без привилегий администратора, поэтому я приделал переопределение ключа с HKLM в HKCU
[DllImport("advapi32.dll", SetLastError = true)]
private static extern long RegOverridePredefKey(IntPtr hkey, IntPtr hnewKey);
[DllExport]
public static void DllRegisterServer()
{
var key = Registry.CurrentUser.OpenSubKey(@"Software\Classes");
if (RegOverridePredefKey(Registry.ClassesRoot.Handle.DangerousGetHandle(), key.Handle.DangerousGetHandle()) != 0)
{
...
}
Assembly asm = Assembly.GetExecutingAssembly();
RegistrationServices regAsm = new RegistrationServices();
bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);
RegOverridePredefKey(Registry.ClassesRoot.Handle.DangerousGetHandle(), IntPtr.Zero);
key.Close();
}
[DllExport()]
public static void DllUnregisterServer()
{
var key = Registry.CurrentUser.OpenSubKey( @"Software\Classes");
if (RegOverridePredefKey(Registry.ClassesRoot.Handle.DangerousGetHandle(), key.Handle.DangerousGetHandle()) != 0)
{
...
}
Assembly asm = Assembly.GetExecutingAssembly();
RegistrationServices regAsm = new RegistrationServices();
bool bResult = regAsm.UnregisterAssembly(asm);
RegOverridePredefKey(Registry.ClassesRoot.Handle.DangerousGetHandle(), IntPtr.Zero);
key.Close();
}
3. Теперь сборку можно регистрировать через regsvr32, regasm и даже через rundll32.exe НашаСборка.dll,DllRegisterServer. Помним про платформу и про то, что для регистрации 32-сборок нужно вызывать соответствующие утилиты из C:\Windows\SysWow64