【问题标题】:Visual Studio: How to work with a base code?Visual Studio:如何使用基本代码?
【发布时间】:2011-07-12 06:25:27
【问题描述】:

为了支持 CRM SDK 的 2 个主要版本,我必须有 2 个具有相同代码但不同库的项目。

他们在版本中唯一改变的只是导入的库,这不仅适用于默认的 WebProject,而且适用于我正在使用的所有类项目。

我怎样才能轻松拥有相同的代码并且可以针对不同的版本进行测试/构建?

举个例子:

我的解决方案中有:

Class Library: `Authentication.7` 
Class Library: `Authentication.6` 
Class Library: `Shared.WebControls` 
Class Library: `Shared.Utilites` 
Web Project: `MyWebApp` 

Authentication.6 的一部分确实具有与 Authentication.7 库不同的代码,因为这些主要版本之间的身份验证非常不同,所有其他项目只是从 CRM SDK 中引用了所有需要的 DLL

有没有办法构建/测试可以加载正确的references,以便我仍然可以使用基本代码?

在这种情况下你们会怎么做?我很难坚持 2 个基本代码:-/

【问题讨论】:

    标签: visual-studio-2010 build-automation


    【解决方案1】:

    只要基础代码位于同名但版本不同的程序集中,您就可以尝试设置运行时程序集绑定。

    假设您的程序集是针对两个基本 dll 的早期版本编译的,但您希望同一个程序集与新版本的基本 dll 一起使用,请将以下内容添加到您的 app|web.config 文件中

    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="SoCore"
              publicKeyToken="bdda2d694ae22a86"
              culture="en-us" />
            <bindingRedirect oldVersion="7.0.3000.0-7.0.4002.0" newVersion="7.0.4003.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="SoDatabase"
              publicKeyToken="bdda2d694ae22a86"
              culture="en-us" />
            <bindingRedirect oldVersion="7.0.3000.0-7.0.4002.0" newVersion="7.0.4003.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    放入新的程序集和您的程序集 - 针对较旧的基础程序集编译,并且一切都应该仍然有效 - 除非较新的基础程序集包含您所依赖的 api 中的重大更改。

    【讨论】:

      【解决方案2】:

      一种方法是为每个“相同”库创建 2 个项目,但使用相同的源文件集。您可以通过创建第二个项目(例如 Shared.WebControls6 和 Shared.WebControls7)并在将现有文件添加到新项目时使用“添加为链接”选项来做到这一点 - 现有项目已经拥有所有文件。请注意,这样做的缺点是对项目文件的任何更改(例如添加新类)都需要对两个项目进行。

      另一种选择可能是在项目文件本身中获得幻想。可能类似于(注意:未测试):

      <ItemGroup>
        <Reference Include="Authentication.7" Condition=" '$(foo)' == '7' " />
        <Reference Include="Authentication.6" Condition=" '$(foo)' == '6' " />
      </ItemGroup>
      <!-- or -->
      <ItemGroup>
        <Choose>
          <When Condition="'$(foo)'=='7'">
            <Reference Include="Authentication.7" Condition=" '$(foo)' == '7' " />
          </When>
          <Otherwise>
            <Reference Include="Authentication.6" Condition=" '$(foo)' == '6' " />
          </Otherwise>
        </Choose>
      </ItemGroup>
      

      要构建,您必须将 foo 的值设置为您希望构建的版本(例如 msbuild myproj.csproj /p:foo=7)。

      【讨论】:

      • 最大的缺点是,对于我在“主”项目中添加的每个文件,我需要记住子项目中的Add as link...。这应该更容易......
      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      相关资源
      最近更新 更多