2009-03-28 2 views
6

어셈블리에 강력한 이름을 추가하기 위해 명령 줄을 호출하는 것 외에도 강력한 이름을 제거한 후에 어셈블리를 사퇴하게하는 API가 있습니까?강력한 이름으로 .NET 어셈블리를 프로그래밍 방식으로 (다시) 서명하려면 어떻게합니까?

+0

회신을 삭제했습니다 (명령 줄). 나는 커맨드 라인 ('sn -R' 등)을 제외하고 이것을 수행하는 다른 방법을 알지 못합니다. –

+0

이것을 할 방법을 찾았습니까? – DannyT

+0

조립품은 조립품이 없어도 만들어지는 것과 같이 강하게 이름이 붙여지지 않아도됩니다. 그렇지 않으면 조립품이 무효화됩니다 (조작으로 인해). –

답변

2

당신은 mscoree's strong name APIs을 들여다 볼 수 있지만 추천하지는 않습니다.

+0

왜 안 되니? 나는 이것을 또한하고, sn을 산란시키고 싶지 않다.exe (주로 "우아한"메커니즘을 원하기 때문에) – DannyT

+0

이러한 API는 .NET 4부터는 더 이상 사용되지 않습니다. –

+0

.NET 4에서는 in-proc SxS가 도입 되었기 때문에 더 이상 사용되지 않습니다. 즉 전역 정적 함수는 더 이상 사용되지 않습니다. 관리되지 않는 강력한 명명 API 자체는 더 이상 사용되지 않으며 대신 호스팅 인터페이스 (특히 ICLRStrongName : http://msdn.microsoft.com/en-us/library/dd409349.aspx)에서 호출해야합니다. – hbw

3

어셈블리가 "강력한 이름 제거"의 의미에 달려 있습니다. 어셈블리에 강력한 이름이 지정되어 있지 않으면 강력한 이름으로 다시 빌드 될 때까지 아무 것도 (심지어 sn.exe조차도) 어셈블리를 사임 할 수 없습니다.

그러나 질문에 대답하기 위해 : 모든 강력한 명명 기능은 CLR의 unmanaged strong naming API을 통해 노출됩니다. 특히, StrongNameSignatureGenerationEx을 원합니다. 이는 알다시피, sn -R[a] 명령과 기능적으로 동일합니다.

즉, 많이sn.exe을 호출하는 것이 더 쉽고 간단합니다. 관리되지 않는 강력한 이름 API에 액세스하는 것은 마음이 희미하지 않기 때문에 (.NET 4의 경우) 먼저 CLR의 메타 호스트 API를 사용해야합니다. 이런 이유로 관리되지 않는 코드에서이 작업을 완전히 수행해야하는 번거 로움이 있습니다. (나는 managed wrapper from Microsoft on CodePlex을 발견했다,하지만 난 StrongNameSignatureGenerationEx 그것을 통해 제대로 작동 가져올 수 없습니다.)

당신이있는 경우,하지만, 여기에 관리되지 않는 코드에서 강력한 이름 API에 액세스하는 방법에 대한 대략적인 윤곽의 수 :

  • CLRCreateInstance을 호출하여 ICLRMetaHost 또는 ICLRMetaHostPolicy의 인스턴스를 얻습니다.
  • 해당 인스턴스를 사용하여 현재 런타임의 인스턴스 (예 : ICLRRuntimeInfo 인스턴스)를 가져옵니다. 이 작업을 수행 할 수있는 방법은 다양합니다. 자세한 내용은 MSDN을 참조하십시오.
  • 당신이 ICLRRuntimeInfo의 인스턴스가되면, ICLRRuntimeGetInterface 메소드를 호출 클래스/인터페이스 식별자 CLSID_CLRStrongNameIID_ICLRStrongName를 전달하여 ICLRStrongName의 인스턴스를 얻을 수 있습니다.

이제 ICLRStrongName의 인스턴스를 가지고, 당신은 결국 그것을 사용 StrongNameSignatureGenerationEx를 호출 할 수

// This is the ICLRStrongName instance you'll need. Assume GetStrongNameAPI 
// corresponds to an implementation of the rough process I outlined above. 
ICLRStrongName *snAPI = GetStrongNameAPI(); 

// You'll have to load the .snk file into memory yourself using the Win32 
// file APIs, the details of which I've omitted for the sake of brevity. 
BYTE *keyPairBlob = NULL; 
DWORD keyPairBlobSize = 0; 
LoadKeyPair(&keyPairBlob, &keyPairBlobSize); 

// Once you've got the key pair blob, you can now (re-)sign the assembly 
HRESULT hr = snAPI->StrongNameSignatureGenerationEx(
    L"path\\to\\your\\assembly.dll", 
    NULL, 
    keyPairBlob, 
    keyPairBlobSize, 
    NULL, 
    NULL, 
    0 
); 

// Do whatever error handling needs to be done with the given HRESULT 

(선택적으로, 당신은 .snk 키 쌍 대신 키 컨테이너에 서명 할 경우 키 컨테이너의 이름을 두 번째 인수로 전달하고 키 쌍 blob/size 인수를 NULL로 남겨 둘 수 있습니다.)

결론 : 실제로 강력한 네이밍 API를 거치지 않는 한 , 그것 sn.exe 자체를 호출하여 어셈블리에 서명하기가 쉽습니다.

관련 문제