Как запустить regasm.exe из программы на C ++? - PullRequest
1 голос
/ 09 июня 2009

Я хочу написать программу, которая запускает regasm.exe для программного создания файла tlb.

Как я могу это сделать ??

Ваша помощь очень ценится ...

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 июня 2009

Вы должны использовать функцию CreateProcess () для запуска командной строки, например "fullPathToRegasm / somekeys filename".

Основная проблема заключается в обнаружении местоположения регазма - используйте для этого функцию GetCORSystemDirectory (). Сначала используйте сначала LoadLibrary () для загрузки mscoree.dll, затем вызовите GetProcAddress (), чтобы найти функцию GetCORSystemDirectory (), а затем вызовите функцию.

Это даст вам рут установки .NET. regasm обычно находится в том же подпуте корневого каталога установки на любом компьютере, поэтому вы можете безопасно объединить обнаруженный корень с подпутем, и это будет действительное расположение regasm.

0 голосов
/ 23 февраля 2017

Поскольку NET является параллельной установкой, в вашей системе может быть несколько версий regasm.exe, и аналогично некоторые версии являются просто обновлениями, поэтому вы можете пропустить ее в некоторых местах, которые вы ожидаете найти.

Я часами искал лучший способ сделать это, поскольку есть также несколько попыток добраться до нужной точки ( реестр , неуправляемый код , Среда и т. Д.), Которые сильно различаются в NET версии . И каждая версия Windows также приносит свою собственную NET версию.

Ни один из вышеперечисленных не был достаточно стабильным для всех систем на мой вкус, поэтому я нашел свой собственный путь: просто поиск всех доступных файлов regasm.exe и проверка, какая из них является самой новой версией. Так просто.

Это может быть вопросом мнения, но если вы чувствовали, что мой ответ мог бы иметь больший успех, палец вверх !!

// Scan for ALL regasm.exe available.
string netdir = Environment.GetEnvironmentVariable("WINDIR") + "\\Microsoft.NET\\";
string[] filelist = System.IO.Directory.GetFiles(netdir, "regasm.exe", System.IO.SearchOption.AllDirectories);

// Find the NEWEST regasm.exe available.
string newestFilePath = string.Empty;
FileVersionInfo currFileVersion = null;
FileVersionInfo newestFileVersion = null;
foreach (string currFilePath in filelist) {
    currFileVersion = FileVersionInfo.GetVersionInfo(currFilePath);
    if (newestFileVersion == null) {
        newestFilePath = currFilePath;
        newestFileVersion = currFileVersion;
    } else if ((currFileVersion.FileMajorPart >= newestFileVersion.FileMajorPart) &&
        (currFileVersion.FileMinorPart >= newestFileVersion.FileMinorPart) &&
        (currFileVersion.FileBuildPart >= newestFileVersion.FileBuildPart) &&
        (currFileVersion.FilePrivatePart > newestFileVersion.FilePrivatePart)) {
        newestFilePath = currFilePath;
        newestFileVersion = currFileVersion;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...