繁体   English   中英

如何从C#项目的构建事件中访问Visual Studio解决方案级平台?

[英]How can you access the Visual Studio solution level platform from a C# project's build event?

我们有一个大型的VS 2010解决方案,主要是C#代码,但有一些本地DLL,各种C#项目依赖(包括我们的单元测试DLL)。 我们正在尝试支持32位和64位版本的库。 所以我们现在将本机DLL构建为32位和64位。 问题是我们的很多C#项目都有后期构建事件,它们将所需的本机DLL复制到项目的TargetDir中。 现在我们有两个不同版本的本机DLL(32位和64位),我需要能够指定正确的dir来复制本机DLL。 我原本以为我可以简单地在路径中使用$(Platform),如下所示:

copy $(SolutionDir)\NativeDll\$(Platform)\$(Configuration) $(TargetDir)

但这不起作用,因为$(Platform)是项目的平台,而不是解决方案级平台。 在这种情况下,$(平台)是“任何CPU”。 从我所看到的C#项目中的后期构建事件宏看,似乎没有办法访问正在构建的解决方案级平台。 有没有更好的方法来实现我的目标?

当我必须这样做时,我只是简单地将我的所有程序集构建为x86或x64而不是AnyCPU,并且有两个独立的输出包。 如果你知道你的进程必须是32位或64位prori,那么AnyCPU真的没有意义。

我相信解决方案的平台与项目不同的只是文本。

我过去的成就是:

  1. 从解决方案中删除Win32和“混合平台”(并在添加项目后继续这样做)。

  2. 将所有C#DLL设置为在解决方案平台AnyCPU,x86,x64中构建为AnyCPU。 (如果您希望能够在Blend中打开或者解决方案中有任何纯托管应用程序,请不要删除AnyCPU。)

  3. 将C#EXE和单元测试设置为在x86解决方案平台中的x86和x64解决方案平台中的x64中构建,而不是在AnyCPU解决方案平台中构建。

  4. 当解决方案是x86并将其输出到$(ProjectDir)\\ bin \\ x86 \\ $(配置)并将其设置为与路径中的obj相同而不是bin时,将所有本机设置为Win32。 x64与x64相同,而不是x86和Win32。

  5. 设置C#EXE的预构建事件和单元测试,以从项目配置名称的相对路径复制它们所依赖的本机DLL:$(Config)

  6. 设置单元测试的类初始化以复制测试bin目录的整个内容(当然是正确的平台和配置)来测试'out dir。 如果#DEBUG和unsafe sizeof(IntPtr)用于告知在哪里查找测试的bin目录。

  7. 手动(使用记事本)在解决方案之外添加从解决方案的部署位置使用x86 / x64程序集的.csproj文件的相对引用路径,因此路径将包括$(Platform)和$(Configuration),而不是每个用户。

微软:Visual Studio中更好的32/64位支持将真正到位。

我自己没有使用它,但Build - > Batch Build可能就是你想要的。 有了它,您可以构建多个平台。

http://msdn.microsoft.com/en-us/library/169az28z.aspx

当然,这实际上并不能让您访问解决方案的“平台”,但您不需要,因为您将单独构建每个平台。

更新:如果要自动构建,请创建包含以下内容的批处理文件

"c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv" ../solution.sln /rebuild "platform"

其中'platform'是“Release | Any CPU”,“Release | x86”等,并为您需要构建的每个配置重复该行。 使用配置管理器为x86和x64的构建设置每个项目,您应该拥有所需的项目。

Francesco Pretto有一个扩展,有助于此。 它似乎有一些怪癖和缺陷,但它是一个开始。

http://visualstudiogallery.msdn.microsoft.com/619d92a2-4ead-410d-a105-135f7b4b4df9

使用github上的源代码:

https://github.com/ceztko/SolutionConfigurationName

我不认为'Active Solution Configuration'具有等效的宏属性。

我建议在所有.csproj文件中手动添加自定义属性,如下所示(请参阅为每个配置/平台组合添加的新MyVar自定义属性):

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
    <MyVar>MyDebugAnyCpu</MyVar>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <MyVar>MyReleaseAnyCpu</MyVar>
  </PropertyGroup>

您可以使用“卸载项目”和“编辑MyProject.csproj”菜单来编辑Visual Studio中的.csprojet。 重要的是要知道即使使用普通的GUI编辑器保存它,Visual Studio也不会破坏这些“未知”值。

然后在post build事件中,您可以使用这些值,例如:

copy $(SolutionDir)\$(MyVar)\$(Platform)\$(Configuration) $(TargetDir)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM