Как запустить regasm.exe из программы на C ++ (.NET 4)

Мне нужно зарегистрировать .NET COM DLL из программы на C ++, которая его использует. Для версий .NET более старых, чем .NET 4, это объясняется в Как запустить regasm.exe из программы на C ++?. Ниже приведен минимальный код (без проверок), который предоставляет путь к более старой версии CLR.

CComBSTR mscoreeName("mscoree.dll");
HINSTANCE hMscoree = CoLoadLibrary(mscoreeName, FALSE);
typedef HRESULT (WINAPI *LPFNGETCORSYSDIR)(LPWSTR, DWORD, DWORD*);
LPFNGETCORSYSDIR lpfunc = (LPFNGETCORSYSDIR)GetProcAddress(hMscoree,_T("GetCORSystemDirectory"));

DWORD bufferSize = 256;
DWORD bufferUsed;
LPWSTR pwzBuffer = new WCHAR[bufferSize];
(*lpfunc)(pwzBuffer, bufferSize, &bufferUsed);

Однако, поскольку я использую .NET 4, метод GetCORSystemDirectory заменяется на ICLRRuntimeInfo :: GetRuntimeDirectory, который не является точкой входа в mscoree.dll (проверяется с помощью зависит). По документации на MSDN метод включен в качестве ресурса в MSCorEE.dll.

Вопрос в том, как получить доступ к этому методу из C ++?

Кроме того, мне интересно, если нет более легкого пути …

0

Решение

Проблема со способом работы в вопросе заключается в том, чтобы найти правильное местоположение RegAsm. Благодаря комментарию Ханса Пассанта об использовании RegistrationService.RegisterAssembly я изменил ClassLibrary на саморегистрацию исполняемого файла.

static void Main(string[] args)
{
if (args.Length != 1)
{
ShowHelpMessage();
return;
}

if (args[0].CompareTo("/register") == 0)
{
Assembly currAssembly = Assembly.GetExecutingAssembly();
var rs = new RegistrationServices();
if (rs.RegisterAssembly(currAssembly, AssemblyRegistrationFlags.SetCodeBase))
{
Console.WriteLine("Succesfully registered " + currAssembly.GetName());
} else
{
Console.WriteLine("Failed to register " + currAssembly.GetName());
}
return;
}

if (args[0].CompareTo("/remove") == 0)
{
Assembly currAssembly = Assembly.GetExecutingAssembly();
var rs = new RegistrationServices();
if (rs.UnregisterAssembly(currAssembly))
{
Console.WriteLine("Succesfully removed " + currAssembly.GetName());
}
else
{
Console.WriteLine("Failed to remove " + currAssembly.GetName());
}
return;
}

ShowHelpMessage();
}
0

Другие решения


По вопросам рекламы [email protected]