Visual Studio 2005
2007. 11. 2.
안혁
http://hyok.kr


요즘은 서버가 64비트가 많지요? 하지만 개발자 PC는 아직 32비트가 많습니다. 더군다나 노트북이라면 더욱 그렇지요. 개발자 PC(32bit)에 작업한 프로젝트를 서버에 올려놓은 후에 서버에서 컴파일 하게 되는 경우, 빌드 후 이벤트가 문제를 발생시킬 수 있습니다. 32비트와 64비트 윈도우에서 regsvcs, regasm, gacutil의 경로가 다르기 때문입니다.

서버와 개발자 PC에 각각 환경변수 PATH를 적절히 잡아 주면 다음에 방법을 사용하지 않으셔도 됩니다. 환경변수를 매번 잡아주지 않고도 빌드 후 이벤트가 작동되도록 하려면 다음을 빌드 후 이벤트에 추가하세요.

echo ***** 빌드 후 이벤트 시작*****
set PROCESSOR_ARCHITEW6432
if ERRORLEVEL 1 GOTO x86
if NOT ERRORLEVEL 1 GOTO x64

:x86
set GACUTIL="%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe"
set REGSVCS="%windir%\Microsoft.NET\Framework\v2.0.50727\RegSvcs.exe"
set REGASM="%windir%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe"
GOTO end

:x64
set GACUTIL="%ProgramFiles(x86)%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe"
set REGSVCS="%windir%\Microsoft.NET\Framework64\v2.0.50727\RegSvcs.exe"
set REGASM="%windir%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe"
GOTO end

:end
echo gacutil 경로 : %GACUTIL%
echo regsvcs 경로 : %REGSVCS%
echo regasm  경로 : %REGASM%

%REGASM% "$(TargetPath)"
%GACUTIL% /i "$(TargetPath)"
%REGSVCS% /u "$(TargetFileName)"
%REGSVCS% "$(TargetPath)"


검은 글씨는 프로젝트에 따라서 변경되는 부분이겠습니다. regasm, regsvcs, gacutil 명령어 대신 %REGASM%, %GACUTIL%, %REGSVCS%를 사용하면 됩니다.
Posted by 안혁 windfruit

Visual Studio 2005
.NET Framework 2.0
2007. 10. 31.
안혁
http://hyok.kr

빌드 후 이벤트에서 DLL 등록을 할 경우 환경변수 PATH에 경로를 잡아주면 되지만, .NET 1.1 개발로 동시에 하고 있다면 매번 환경변수를 고쳐주어야 하므로 곤란합니다. 빌드 후 이벤트 실행 시 절대경로를 입력함으로 Visual Studio 2003 이든 Visual Studio 2005  이든 빌드 후 이벤트 작업이 가능하게 하는 것이 좋겠지요.
단, 32비트 윈도우와 64비트 윈도우의 경로에 차이가 있음으로 이를 주의하여야 합니다.

* gacutil.exe

- 32bit
%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\
- 64bit
%ProgramFiles(x86)%\Microsoft Visual Studio 8\SDK\v2.0\Bin\



* RegSvcs.exe

- 32bit
%windir%\Microsoft.NET\Framework\v2.0.50727
- 64bit
%windir%\Microsoft.NET\Framework64\v2.0.50727



이렇게 하면 Windows를 D에 설치한 사람들도 특별한 경로 변경 없이 해당 명령어를 사용 할 수 있겠습니다.
커맨드 창에서 직접 실행의 경우, 저 경로를 다 입력하는 것은 매우 번거로운 일이지요. 명령어만 입력하면 결국 환경변수 PATH의 영향을 받게 되므로 선호하는 버전을 PATH에 잡아주든지, 각각의 명령 프롬프트(시작->프로그램->Visual Studio 200? 에 있음)를 실행해서 작업해야 하겠습니다. 어떻게 설정했는지 꼭 기억하시구요. 예상치 못했던 에러가 발행할 수 있습니다. 등록한 DLL을 못찾겠다며 멈춰 버린다던지...

Posted by 안혁 windfruit

Visual Studio 2005
2007. 10. 30.
안혁
http://hyok.kr


커맨드 창에서 다음과 같이 입력합니다.

> tlbimp DLL파일이름 /keyfile:키파일이름

ex) tlbimp namomime.dll /keyfile:sn.key

이렇게 실행하면 강력한 이름으로 서명된 Interop DLL인 NAMOMIMELib.dll 이 생성됩니다.


tlbimp.exe는 경로는 다음과 같습니다.

C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\

참고 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=243024&SiteID=1


------------------------------------------------------------------------------

Q

In VS2003 C++, I can configure strong names for ActiveX control references so I can sign and build my main assembly.  This is done from the Project  Managed Wrapper Properties.  But I cannot find an equivalent for this in VS2005 C++.  I see properties for references in Project References, but they are grayed out.  Is there a way to sign ActiveX controls/references in VS2005?

Thanks

ps)
Here are more details:

I have a VS 2005 C++ application that uses some COM components.  In order to sign my main assembly, I need to sign the Interop and AxInterop assemblies created for the COM components.

If I try to strong name my main assembly with a key file, then when I compile my application, I get errors similar to these:

LINK : error LNK2022: metadata operation failed (8004041F) : Referenced assembly 'Interop.xxxxxxLib.1.0' does not have a strong name
LINK : error LNK2022: metadata operation failed (8004041F) : Referenced assembly 'AxInterop.yyyyyyyy' does not have a strong name
LINK : fatal error LNK1255: link failed because of metadata errors

So I want to sign the Interop and AxInterop assemblies.

In VS2003, this can be accomplished by these steps:
1. Select Properties from the Project menu.
2. Click on Managed Wrapper in the tree on the left.  You will see $(OutDir)\Interop.$(InputName).dll for the Output Name.
3. Enter the Public Key File value and set the Strong Name type to Key File.
4. Click on Auxilary Managed Wrapper in the tree on the left.  You will see $(OutDir)\AxInterop.$(InputName).dll for the Output Name.
5. Enter the Public Key File value and set the Strong Name type to Key File.

My question is: How do I do the same thing above in VS 2005?
Or, how can I use the assembly linker for Interop and AxInterop assemblies? I don't know which name to use for module name for the assembly linker example in the link you provided:

al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk

Thanks,
Alan


A
Bingo!

I finally got it to work today!
Here's what I did for my VC++ 2005 app:

For each project in the solution:
Set the key file to mykey.snk in project properties linker advanced.

For each activex control, execute:
aximp /keyfile:mykey.snk someControl.ocx
(this generates AxsomeControlLib.dll and someControlLib.dll)

For each com library, execute:
tlbimp /keyfile:mykey.snk someComServer.tlb
(this generates someComServerLib.dll)

For each project in the solution that uses the components above:
Remove the current references for the components.
Add the component references using the files output from aximp and tlbimp.

Build the solution.

Note:
aximp and tlbimp are found in:
\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin

Posted by 안혁 windfruit
이전버튼 1 이전버튼