한 프로젝트에서 다른 DLL을 어떻게 만들 수 있습니까?
-
03-07-2019 - |
문제
해결할 수 있는지 모르는 질문이 있습니다. Visual Studio 2005에 하나의 C# 프로젝트가 있으며 사전 처리기 상수에 따라 다른 DLL 이름을 만들고 싶습니다. 이 순간에 내가 가진 것은 사전 처리기 상수, 2 개의 SNK 파일 및 2 개의 어셈블리 가이드입니다. 또한 두 개의 구성 (디버그 및 디버그 프리 프로세서)을 생성하고 SNK 및 Guidate를 사용하여 완벽하게 컴파일합니다.
#if PREPROCESSOR_CONSTANT
[assembly: AssemblyTitle("MyLibraryConstant")]
[assembly: AssemblyProduct("MyLibraryConstant")]
#else
[assembly: AssemblyTitle("MyLibrary")]
[assembly: AssemblyProduct("MyLibrary")]
#endif
이제 두 어셈블리를 GAC에 넣어야합니다. 첫 번째 어셈블리는 문제없이 추가되지만 두 번째 어셈블리는 그렇지 않습니다.
하나의 Visual Studio 프로젝트에서 둘 이상의 다른 어셈블리를 만들려면 어떻게해야합니까?
사전 처리기 상수에 따라 DLL 이름을 변경하기 위해 "AssemblyInfo.cs"에 새 라인을 포함하는 것을 잊어 버렸을 수도 있습니까?
해결책
빌드 후 이벤트는 다음과 같습니다.
if "$(ConfigurationName)" == "Debug" goto Debug
if "$(ConfigurationName)" == "Release" goto Release
goto End
:Debug
del "$(TargetDir)DebugOutput.dll"
rename "$(TargetPath)" "DebugOutput.dll"
:Release
del "$(TargetDir)ReleaseOutput.dll"
rename "$(TargetPath)" "ReleaseOutput.dll"
:End
변화 DebugOutput.dll
그리고 ReleaseOutput.dll
적절한 파일 이름에. 당신은 변경할 수 있습니다 "Debug"
그리고 "Release"
다른 구성을 지원하고 더 많은 구성을 지원하기 위해 섹션을 추가하십시오.
이 스크립트는 파일 이름이 다른 두 개의 DLL을 만듭니다. 두 가지 다른 어셈블리 이름을 만들려면 두 가지 옵션이 있습니다.
어셈블리 이름은 다음과 같이 제작되었습니다 다음:
Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'
따라서 문화 정보, 버전 또는 강한 이름을 변경해야합니다.
가장 간단한 두 가지 옵션은 다음과 같습니다.
어셈블리 버전 변경 :
#if SOME_COMPILER_SYMBOL [assembly: AssemblyVersion("1.0.0.0")] #else [assembly: AssemblyVersion("1.0.0.1")] #endif
키 파일 변경 - 두 개의 키 파일 생성
sn
도구 및에서AssemblyInfo.cs
:#if SOME_COMPILER_SYMBOL [assembly: AssemblyKeyFile("FirstKey.snk")] #else [assembly: AssemblyKeyFile("SecondKey.snk")] #endif
이 두 가지 옵션은 GAC가 알고있는 한 두 개의 다른 어셈블리를 초래할 것입니다. '단순한'이름이 아닌 전체 어셈블리 이름을 비교하기 때문입니다.
다른 팁
Visual Studio는 구성당 출력 파일 이름을 허용하지 않습니다. 그러나 빌드 스크립트의 일부로 출력 파일의 이름을 바꿀 수 있습니다. 해당 특정 프로젝트에 대한 MSBuild 스크립트 에서이 작업을 수행 할 수 있습니다.
예를 들어, 이것을 당신의 끝에 두십시오. .csproj 파일:
<Target Name="AfterBuild">
<Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
<Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>
나는 이것을 직접 시도하지 않았으므로 친절한 제안으로 받아들입니다. .csproj를 수동으로 편집 해보십시오.
<Target Name="BeforeBuild">
<AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
<AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>
나는 그런 방법이 없다고 생각합니다. 출력 어셈블리 이름은 프로젝트 설정으로 엄격하게 고정되어 있습니다. 하나의 프로젝트 당 하나의 어셈블리.
또한 주어진 어셈블리 attributes는 파일 이름이 아닌 가시 어셈블리 속성 (예 : Windows Explorer)을 나타냅니다.