2009-06-09 25 views

回答

3

您必須使用CreateProcess()函數來運行命令行,如「fullPathToRegasm/somekeys文件名」。

主要問題是檢測regasm位置 - 使用GetCORSystemDirectory()函數。首先使用LoadLibrary()加載mscoree.dll,然後調用GetProcAddress()來定位GetCORSystemDirectory()函數,然後調用該函數。

這將爲您帶來.NET安裝的根源。 regasm通常位於任何給定機器上安裝根目錄的相同子路徑中,因此您可以安全地將檢測到的根與子路徑組合起來,這將是一個有效的regasm位置。

+0

你可以給我示例代碼片段plzzzz – Cute 2009-06-09 06:00:02

0

由於NET是並排安裝,因此您的系統中可能會有regasm.exe的多個版本,並且類似地,某些版本只是更新,因此您可能會從某些位置找不到您期望找到的版本。

我花了幾個小時尋找做到這一點的最好辦法,因爲也有一些atempts以獲得正確的點(registryunmanaged codeEnvironment等)對NET versiongreatly varies。而且每個Windows版本都帶有his own 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; 
    } 
}