2011-02-01 13 views
6

.NET 어셈블리를 COM 서버로 사용할 수있게하려면 특성 집합을 추가 한 다음 regasm을 사용하여 COM 서버로 등록해야합니다.정확히 왜 regasm은 강력한 이름으로 서명하는 것에 대해 경고합니까?

어셈블리가 /codebase 키를 사용하여 실행 강력한 이름 regasm로 서명되지 않은 경우 어셈블리 가 같은 컴퓨터에 다른 어셈블리 방해 할 수있는 나는 강력한 이름으로 서명해야하지만 것을 말하는 RA0000 경고를 보여줍니다 등록이 성공하고 심지어 잘 작동합니다.

AFAIK의 강력한 이름은 DLL 지옥을 방지하기위한 것입니다. 그러나 COM은 또한 DLL 지옥을 막기위한 것입니다. COM에 노출 된 인터페이스를 변경하면 GUID를 변경하거나 적어도 바이너리 호환성을 유지해야합니다. 따라서 강력한 이름으로 서명하면 아무 것도 쓸모없는 것으로 보이지 않습니다. COM 인터페이스를 깨고 동일한 키 쌍으로 서명하고 본격적인 DLL 지옥을 사용하지 못하게하는 것은 없습니다.

COM이 노출 된 .NET 어셈블리의 경우 강력한 이름으로 서명하는 용도는 무엇입니까?

답변

7

서투른 경고입니다. COM DLL Hell에는 두 가지 측면이 있습니다. 정말 나쁜 것은 공개 인터페이스를 수정하고 새로운 GUID를 할당하지 않는 것입니다. 다시 컴파일되지 않은 클라이언트 응용 프로그램은 완전히 잘못된 메서드를 호출하거나 오류 원인이 무엇인지 전혀 알려주지 않는 심한 AccessViolationException을 가진 폭탄을 호출 할 때 충돌하고 화상을 입는 경향이 있습니다.

두 번째 것은 모든 작업을 올바르게 수행하고 (새 GUID 할당) 기존 DLL을 새 버전으로 덮어 쓰는 것입니다. 그 부실한 클라이언트 응용 프로그램을 여전히 크래시하지만, 원인을 진단하는 데 도움이되는 매우 특정한 예외를 생성하는 E_NOINTERFACE hresult를 사용하면 더욱 경미하게 작동합니다. 사용자는 더 행복하지 않습니다.

시나리오에는 .NET에서 사용할 수있는 솔루션이 있습니다. GAC는 이전 버전과 새 버전이 공존 할 수 있고 오래된 클라이언트 응용 프로그램이 계속 유지되도록 서로 다른 버전 번호의 어셈블리를 나란히 배치 할 수 있습니다 이전 버전에 만족해야합니다. 강력한 이름이 필요합니다. 예, GAC를 사용하지 않을 것이라는 점을 분명히하기 때문에/codebase를 사용할 때 경고가 확실히 표시되지 않을 수 있습니다./codebase를 사용하면서 코를 약간 조정할 필요는 없습니다. 또한, 테스트 중에는 dev 머신에서 GAC를 사용하지 않지만 배치시 반드시 고려해야합니다.

1

강력한 명명은 주로 Dll을 GAC에 넣는 데 사용됩니다. 따라서 동일한 컴퓨터에 동일한 이름 (!)의 DLL을 여러 버전으로 안전하게 포함 할 수 있습니다. 일반 COM-Dll에서 종종 문제가 발생합니다. DLL에 서명하지 않으면 GAC에 대한 권한이 제거됩니다. 그로 인해 즉시 문제가 발생하지는 않지만 유용한 기능을 사용하지 않으므로 경고 메시지가 나타납니다.

2

제 생각에 COM은 DLL 지옥을 막을 의도가 없었습니다. 하둡 자체의 구멍이었습니다. "DLL 지옥"이라는 용어는 동일한 이름의 메소드가있는 여러 라이브러리의 문제에서 비롯됩니다. 시스템 레지스트리에 COM 어셈블리를 등록해도 런타임에 해결하는 데 도움이되지 않습니다.

COM 서버 역할을하는 어셈블리에 서명하면 어셈블리가 동일한 컴퓨터의 다른 COM 등록 어셈블리와 충돌하지 않습니다. 서명이 없으면 두 개의 COM 등록 어셈블리에 동일한 이름의 메서드가 있으면 문제가 발생할 수 있습니다.