GAC 등록 - Failure adding assembly to the cache: Invalid file or assembly name.
예전에, tlbimp/ildasm/ilasm 조합으로 Interop DLL을 사용자 정의하는 것에 대해 설명드렸었지요.
[in,out] 배열을 C#에서 C/C++로 넘기는 방법 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/811
위의 방법으로 문제를 잘 해결해서 사용하던 Interop DLL의 이름을 갑자기 바꿀 필요가 있어서 다음과 같이 다시 빌드를 했습니다.
"C:\...\tlbimp" Test.dll /out:Interop.Test.dll
"C:\...\ildasm" Interop.Test.dll /out:Interop.Test.il
... [il 코드 편집] ...
"C:\...\ilasm" Interop.Test.il /dll /key:test.snk /out:Interop.Test.Log.dll
즉, 기존의 "Interop.Test.dll"에서 "Interop.Test.Log.dll"로 바꾼 것입니다. 그런데, 이렇게 하고 났더니 gacutil 등록에서 다음과 같이 오류가 발생했습니다.
D:\...>gacutil /i Interop.Test.Log.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Failure adding assembly to the cache: Invalid file or assembly name. The name of the file must be the name of the assembly plus .dll or .exe .
몇 가지 작업과 함께 위의 이름을 변경한 것이라서 처음에는 원인이 무엇인지 전혀 알 수 없었습니다. 오류 메시지 자체가 너무 평범한 것도 한몫했지요. 물론, 정상적으로 등록하기 위해서는 tlbimp 당시부터 바뀐 어셈블리 이름으로 출력을 해줘야 하는데요. 그래서 다음과 같이 바꿔주어야 합니다.
"C:\...\tlbimp" Test.dll /out:Interop.Test.Log.dll
"C:\...\ildasm" Interop.Test.Log.dll /out:Interop.Test.Log.il
... [il 코드 편집] ...
"C:\...\ilasm" Interop.Test.Log.il /dll /key:test.snk /out:Interop.Test.Log.dll
하지만, 위와 같이 해주면 기존 소스 코드에 "Interop.Test"라고 바인딩된 타입들을 모두 "Interop.Test.Log"로 변경해 주어야 하는 부작용이 있으므로 네임스페이스는 기존과 동일하게 유지되도록 다음과 같이 지정해 주는 것이 더 바람직할 것입니다.
"C:\...\tlbimp" Test.dll /out:Interop.Test.Log.dll /namespace:Interop.Test
"C:\...\ildasm" Interop.Test.Log.dll /out:Interop.Test.Log.il
... [il 코드 편집] ...
"C:\...\ilasm" Interop.Test.Log.il /dll /key:test.snk /out:Interop.Test.Log.dll
참고로, .NET 1.0 ~ 3.5까지의 GAC 등록 위치는 "C:\Windows\assembly" 폴더에서 확인이 가능하지만, .NET 4.0의 경우에는 "C:\Windows\Microsoft.NET\assembly"에서 확장 네임스페이스 뷰어없이 디렉터리 원본 구조 그대로 확인할 수 있습니다. 즉, 기본적으로 HKLM\SOFTWARE\Microsoft\Fusion의 DisableCacheViewer 값이 1로 된 것과 동일한 상태입니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]