어셈블리에 강력한 이름을 추가하기 위해 명령 줄을 호출하는 것 외에도 강력한 이름을 제거한 후에 어셈블리를 사퇴하게하는 API가 있습니까?강력한 이름으로 .NET 어셈블리를 프로그래밍 방식으로 (다시) 서명하려면 어떻게합니까?
답변
당신은 mscoree
's strong name APIs을 들여다 볼 수 있지만 추천하지는 않습니다.
왜 안 되니? 나는 이것을 또한하고, sn을 산란시키고 싶지 않다.exe (주로 "우아한"메커니즘을 원하기 때문에) – DannyT
이러한 API는 .NET 4부터는 더 이상 사용되지 않습니다. –
.NET 4에서는 in-proc SxS가 도입 되었기 때문에 더 이상 사용되지 않습니다. 즉 전역 정적 함수는 더 이상 사용되지 않습니다. 관리되지 않는 강력한 명명 API 자체는 더 이상 사용되지 않으며 대신 호스팅 인터페이스 (특히 ICLRStrongName : http://msdn.microsoft.com/en-us/library/dd409349.aspx)에서 호출해야합니다. – hbw
어셈블리가 "강력한 이름 제거"의 의미에 달려 있습니다. 어셈블리에 강력한 이름이 지정되어 있지 않으면 강력한 이름으로 다시 빌드 될 때까지 아무 것도 (심지어 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
의 인스턴스가되면,ICLRRuntime
의GetInterface
메소드를 호출 클래스/인터페이스 식별자CLSID_CLRStrongName
및IID_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 자체를 호출하여 어셈블리에 서명하기가 쉽습니다.
- 1. 프로그래밍 방식으로 .net 어셈블리를 "다시 부팅"할 수 있습니까?
- 2. jarsign을 강제로 jarfiles에 서명하려면 어떻게합니까?
- 3. 네트워크 드라이브에서 Delphi로 .NET 어셈블리를 실행하려면 어떻게합니까?
- 4. 프로그래밍 방식으로 미디어를 정렬하려면 어떻게합니까?
- 5. 프로그래밍 방식으로 의견을 제출하려면 어떻게합니까?
- 6. 프로그래밍 방식으로 이벤트를 실행하려면 어떻게합니까?
- 7. DUnit 테스트를 프로그래밍 방식으로 이름별로 비활성화하려면 어떻게합니까?
- 8. 기계 이름으로 기계를 프로그래밍 방식으로 끕니까?
- 9. WPF에서 프로그래밍 방식으로 DockPanel을 변경하려면 어떻게합니까?
- 10. 타임 스탬프로 안전하게 데이터에 서명하려면 어떻게합니까?
- 11. 시스템 키로 테스트 스위트에 서명하려면 어떻게합니까?
- 12. Last.fm API에 대한 요청에 안정적으로 서명하려면 어떻게합니까?
- 13. 비디오 드라이버를 다시 시작합니다 (프로그래밍 방식으로)
- 14. 프로그래밍 방식으로 "net send"보내기
- 15. Windows에서 프로그래밍 방식으로 USB 장치 다시 시작
- 16. 정확히 왜 regasm은 강력한 이름으로 서명하는 것에 대해 경고합니까?
- 17. 프로그래밍 방식으로 IIS 6을 구성하려면 어떻게합니까?
- 18. 프로그래밍 방식으로 내 LinkedIn 연락처를 나열하려면 어떻게합니까?
- 19. 프로그래밍 방식으로 인터페이스 작성기 객체를 편집하려면 어떻게합니까?
- 20. OpenOffice.org에서 프로그래밍 방식으로 문서를 저장하려면 어떻게합니까?
- 21. UITextView 포커스를 프로그래밍 방식으로 제공하려면 어떻게합니까?
- 22. 프로그래밍 방식으로 작업 영역의 항목에 액세스하려면 어떻게합니까?
- 23. 프로그래밍 방식으로 Drupal 입력 필터를 적용하려면 어떻게합니까?
- 24. 데이터베이스에 프로그래밍 방식으로 데이터에 액세스하려면 어떻게합니까?
- 25. UITableViewCell. textLabel을 프로그래밍 방식으로 정렬하려면 어떻게합니까?
- 26. Silverlight에서 프로그래밍 방식으로 캔버스를 배치하려면 어떻게합니까?
- 27. 프로그래밍 방식으로 인터넷 연결을 시작하려면 어떻게합니까?
- 28. 프로그래밍 방식으로 도메인 이름을 등록하려면 어떻게합니까?
- 29. 프로그래밍 방식으로 detailsview에서 컨트롤에 액세스하려면 어떻게합니까?
- 30. 프로그래밍 방식으로 키보드 레이아웃을 Cocoa로 변경하려면 어떻게합니까?
회신을 삭제했습니다 (명령 줄). 나는 커맨드 라인 ('sn -R' 등)을 제외하고 이것을 수행하는 다른 방법을 알지 못합니다. –
이것을 할 방법을 찾았습니까? – DannyT
조립품은 조립품이 없어도 만들어지는 것과 같이 강하게 이름이 붙여지지 않아도됩니다. 그렇지 않으면 조립품이 무효화됩니다 (조작으로 인해). –