2011-11-17 2 views
5

그래, 이건 꽤 구체적이라는 것을 알았지 만, 모든 일을 잃어 버렸기 때문에 합리적인 설명이 필요했기 때문에 내 상사와 아내는 그렇지 않았습니다. MSDN에 따르면 나에게
RegAsm regfile 스위치가 코드베이스 스위치와 동일한 출력을 제공하지 않음

화재 :
/regfile 스위치
/codebase 스위치가

"어셈블리에 대한 파일 경로를 specifiying 레지스트리에있는 코드베이스 엔트리를 작성합니다" "어셈블리에 대해 지정된 .reg 파일을 생성합니다"

나는 그것을하는 2 가지 다른 방법이었다고 짐작했다. 같은 물건. 진실이었다 내가 잘못했다 :

방법 1

C:\>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\SERVER.dll" /regfile 
Registry script 'C:\SERVER.reg' generated successfully 

등록 파일 출력 :

REGEDIT4 

[HKEY_CLASSES_ROOT\xfeed.server.X] 
@="SERVER.XLS" 

[HKEY_CLASSES_ROOT\xfeed.server.X\CLSID] 
@="{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}] 
@="SERVER.XLS" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32\1.0.0.0] 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\ProgId] 
@="xfeed.server.X" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories\  {62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}] 

방법이

하지만 내가 직접 코드베이스 스위치 명령을 실행할 때 오히려 reg 파일을 사용하여 r에 영향을받은 키 egsitry이 코드베이스와

C:\>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\SERVER.dll" /codebase 
Types registered successfully 

레지스트리 ouptut (위의 출력의 반대로 작업) 다른 :

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}] 
@="SERVER.XLS" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 
"CodeBase"="file:///C:/SERVER.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32\1.0.0.0] 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 
"CodeBase"="file:///C:/SERVER.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\ProgId] 
@="xfeed.server.X" 




당신이 알 수 있듯이, 물건은 Wow6432Node에 지금 및 infos는 훨씬 포괄적입니다 (특히 CodeBase !!!)

누구든지 나에게 합리적인 이유를 줄 수 있다면 나는 잃어버린 하루의 원인으로 초자연적 인 활동을 언급하는 것을 피할 수 있었다. 나는 매우 감사 할 것이다.

+0

64 비트 버전 대신 32 비트 RegAsm을 사용했기 때문에 어셈블리 등록 문제가 발생했습니다. 동일한/Codebase 매개 변수를 사용하여 두 도구에 등록 해보고 도움이되는지 확인하십시오. –

+0

무엇을위한 이유가 있습니까? 이것은 모두 정상입니다. 귀하의 dev 컴퓨터에서/codebase를 사용하고 올바른 regedit.exe 버전으로 레지스트리에 reg 파일을 재생하십시오. c : \ windows \ syswow64 \ regedit.exe (32 비트 COM 서버용) 설치 프로그램을 시작하는 것 외에도 regfile을 사용하는 것이 중요하지 않습니다. –

+0

@HansPassant : 배포를 위해 클라이언트 컴퓨터에서 RegAsm을 호출하는 대신 명시 적 설치 스크립트를 만들고 싶었 기 때문에 regfile을 사용하는 지점이 있습니다. "codebase"가 생성 한 레지스트리 항목을 정확하게 알고 싶었습니다. –

답변

8

codebase 플래그는 regasm에게 파일의 실제 위치에 대한 참조와 함께 등록하려고한다는 것을 알려준다. 이는 배포 된 응용 프로그램과 함께 dll을 저장하고 GAC에서 dll을 사용하지 않으려는 경우에 유용합니다. 이 플래그를 사용하지 않고 DLL을 전체 기능을 위해 GAC에 넣어야합니다.

regfile 플래그는 regasm에게 실제로 dll을 등록하는 대신 레지스트리 파일을 출력하려고한다고 전합니다.

레지스트리 이외의 다른 dll 위치에 대한 데이터가 포함 된 레지스트리 파일 출력을 원할 경우이 둘을 함께 사용할 수 있으며, 그 중 하나라고 가정한다고 생각합니다.

편집 : 귀하의 코멘트를 기반으로 한 추가 설명.

RegAsm은 일반적으로 GAC에로드 될 것이라는 가정하에 .dll에 대한 기본 정보를 등록합니다. GAC의 모든 것은 시스템이 어셈블리를 제어하고 메모리로로드 할 수 있도록 등록됩니다. 32 비트 시스템에서 codebase 플래그를 사용하면 어셈블리가 정의 된 레지스트리 키에 "codebase"값 키를 거의 직접 추가 한 다음이 값을 .dll이 실제로있는 경로로 설정합니다.

이렇게 등록하면 기본적으로 컴퓨터와 어셈블리에서 코드를 찾을 수있는 곳을 찾고 메모리에로드하는 방법을 알려줍니다. 경우에 따라 호출 프로세스가 어셈블리에 액세스하는 가장 좋은 방법을 알 수 있도록 GAC에서 필요로하는 것 이상의 키가 추가되는 경우가 있습니다.

이제 64 비트 시스템을 사용 중이므로 추가로 문제가 있습니다. 32 비트 및 64 비트 응용 프로그램을 컴퓨터 전체에서 분리하여 보관하는 규칙이 있습니다. 그래서 2 개의 프로그램 파일 폴더가 있고 왜 레지스트리에 wow32 섹션이 있는지 이유입니다. 32 비트 DLL이 등록되면 32 비트 응용 프로그램에서 찾을 수 있도록/codebase 플래그를 사용하여 레지스트리의이 섹션에 저장해야합니다 (레지스트리에 액세스 할 수있는 유일한 부분 임).). 64 비트 dll 인 경우 레지스트리의이 부분에있을 필요는 없습니다.

이제는이 정보로 인해 파일의 출력을 사용하여 설치 프로그램의 레지스트리 스크립트 부분을 작성하는 경우 대상 컴퓨터에서 사용자의 와우 정보가 필요한지 확인해야합니다 섹션 또는 레지스트리의 일반 섹션을 수정하고 실행하기 전에이 스크립트를 적절하게 변경하십시오.

+0

거룩한 암소. 이렇게하면 모든 것이 훨씬 명확 해집니다. Howdya 그 버디 알아? MSDN은 그 점에 대해 매우 명확하지 않으므로 혼란스러워합니다. 기본적으로 regfile 스위치를 사용하여 실제로 코드베이스 swtich가 실제로 무엇을하는지 봅니다. 그러나 나는 틀렸다고 생각한다. 그렇게 할 수있는 방법이 있습니까? –

+0

그것이 무엇을하는지 보면서 무슨 뜻인지 모르겠지만, 내가 생각하는 것을 설명하려고 노력할 것입니다. – Nikkoli

관련 문제