3

我有一個問題,我不知道它是否可以解決。我在Visual Studio 2005上有一個C#項目,我想根據預處理常量創建不同的DLL名稱。我現在所擁有的是預處理器常量,兩個snk文件和兩個程序集的guid。我還創建了兩個配置(調試和調試預處理器),並且它們使用適當的snk和guid完美編譯。如何在一個項目中創建不同的DLL?

#if PREPROCESSOR_CONSTANT 
[assembly: AssemblyTitle("MyLibraryConstant")] 
[assembly: AssemblyProduct("MyLibraryConstant")] 
#else 
[assembly: AssemblyTitle("MyLibrary")] 
[assembly: AssemblyProduct("MyLibrary")] 
#endif 

現在,我必須把這兩個組件放到GAC中。第一個組件添加沒有問題,但第二個不是。

如何從一個Visual Studio項目創建兩個或更多不同的程序集?

有可能我忘了在「AssemblyInfo.cs」中包含一個新行來根據預處理器常量更改DLL名稱?

回答

4

這裏是一個示例生成後事件:

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.dllReleaseOutput.dll到正確的文件名。您可以更改"Debug""Release"以支持其他配置,並添加小節以支持更多配置。


該腳本將創建兩個具有不同文件名的dll;創建兩個不同的AssemblyNames,你有兩個選擇。

集名稱建成follows

Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0' 

所以你必須要麼改變文化信息,版本或強名稱。

兩個最簡單的選項是:

  1. 更改程序集版本:

    #if SOME_COMPILER_SYMBOL 
    [assembly: AssemblyVersion("1.0.0.0")] 
    #else 
    [assembly: AssemblyVersion("1.0.0.1")] 
    #endif 
    
  2. 更改密鑰文件 - 創建兩個密鑰文件與sn工具,並在AssemblyInfo.cs

    #if SOME_COMPILER_SYMBOL 
    [assembly: AssemblyKeyFile("FirstKey.snk")] 
    #else 
    [assembly: AssemblyKeyFile("SecondKey.snk")] 
    #endif 
    

就GAC所知,這兩個選項都會產生兩個不同的程序集 - 因爲它比較了完整的程序集名稱,而不是「簡單」名稱。

-1

我認爲沒有這樣的方式。輸出組件名稱嚴格固定到項目設置中:每個項目一個組件。

此外,您給出的AssemblyAttributes僅指示可見的裝配屬性(例如在Windows資源管理器中),而不是它的文件名。

3

Visual Studio不允許每個配置的輸出文件名。但是,您可以將輸出文件重命名爲構建腳本的一部分。您可以在MSBuild腳本中爲特定項目執行此操作。

例如,把這個在您的的.csproj文件的末尾:

<Target Name="AfterBuild"> 
    <Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/> 
    <Delete Files="$(OutputPath)\YourAssembly.dll"/> 
</Target> 
+0

嗨肯特,我覺得這是我的問題的解決方案,但的MSBuild沒有這樣的命令<的AssemblyName/>。我寫信給微軟的Jay Shrestha,告訴我在Visual Studio中,做我想做的事是不可能的。相反,我不得不使用「msbuild.exe」來構建項目。 – jaloplo 2009-03-04 16:29:14

+0

Visual Studio在每次構建之後執行特定的MSBuild目標。只需編輯該目標並使用適當的MSBuild任務重命名該文件即可。 – 2009-03-04 19:01:26

1

我沒有試過這個,所以把它作爲一個友好的建議。嘗試手動編輯.csproj的增加或取消註釋與下面的啓發文檔片斷的BeforeBuild目標:

<Target Name="BeforeBuild"> 
    <AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName> 
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName> 
</Target> 
相關問題