2009-06-09 10 views

답변

3

"fullPathToRegasm/somekeys filename"과 같은 명령 줄을 실행하려면 CreateProcess() 함수를 사용해야합니다.

주요 문제는 regasm 위치를 감지하는 것입니다. GetCORSystemDirectory() 함수를 사용하십시오. 먼저 첫 번째 LoadLibrary()를 사용하여 mscoree.dll을로드 한 다음 GetProcAddress()를 호출하여 GetCORSystemDirectory() 함수를 찾은 다음 해당 함수를 호출합니다.

이렇게하면 .NET 설치의 근원이됩니다. regasm은 일반적으로 주어진 시스템의 설치 루트와 동일한 하위 경로에 위치하므로 탐지 된 루트를 하위 경로와 안전하게 결합 할 수 있으며 유효한 regasm 위치가됩니다.

+0

샘플 코드 스 니펫 plzzzz – Cute

+1

나는 오히려 그것을 작성하고 진행하면서 구체적인 질문을하기를 제안합니다. – sharptooth

+0

감사합니다. – Cute

0

NET은 병렬 설치이므로 시스템에 regasm.exe 버전이 여러 개있을 수 있으며 일부 버전은 업데이트 일 뿐이므로 일부 위치에서 찾을 수 없을 수도 있습니다.

나는 바로 포인트 (registry, unmanaged code, Environment 등) NET versiongreatly varies에 도착하는 여러 atempts도 있기 때문에,이 작업을 수행하는 가장 좋은 방법을 찾고 시간을 보냈습니다. 또한 각 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; 
    } 
} 
관련 문제