当前位置:  开发笔记 > 编程语言 > 正文

在同一解决方案/项目中使用Visual Studio定位32位和64位

如何解决《在同一解决方案/项目中使用VisualStudio定位32位和64位》经验,为你挑选了2个好方法。

关于如何为多目标设置我的visual studio构建,我有点困惑.

背景:c#.NET v2.0,带有p /调用第三方32位DLL,SQL compact v3.5 SP1,带有安装项目.现在,平台目标设置为x86,因此可以在Windows x64上运行.

第三方公司刚刚发布了他们的DLL的64位版本,我想建立一个专用的64位程序.

这提出了一些我还没有得到答案的问题.我想拥有完全相同的代码库.我必须使用32位DLL或64位DLL的引用来构建.(第三方和SQL Server Compact)

这可以通过2组新配置(Debug64和Release64)来解决吗?

我必须创建2个单独的安装项目(标准视觉工作室项目,没有Wix或任何其他实用程序),还是可以在同一个.msi中解决?

任何想法和/或建议都会受到欢迎.



1> mdb..:

是的,您可以在同一个项目中使用相同的代码库同时定位x86和x64.一般来说,如果你在VS.NET中创建正确的解决方案配置,事情将会正常工作(虽然P/Invoke到完全非托管的DLL很可能需要一些条件代码):我发现需要特别注意的项目是:

引用具有相同名称但具有自己特定位数的外部托管程序集(这也适用于COM互操作程序集)

MSI包(已经注意到,需要以x86或x64为目标)

MSI包中的任何自定义.NET Installer基于类的操作

程序集引用问题无法在VS.NET中完全解决,因为它只允许您将具有给定名称的引用添加到项目中一次.要解决此问题,请手动编辑项目文件(在VS中,在解决方案资源管理器中右键单击项目文件,选择"卸载项目",然后再次右键单击并选择"编辑").在添加对程序集的x86版本的引用之后,您的项目文件将包含以下内容:


  C:\path\to\x86\DLL

将Item标记内的Reference标记包装,表示它适用的解决方案配置,例如:


   ....

然后,复制并粘贴整个ItemGroup标记,并对其进行编辑以包含64位DLL的详细信息,例如:


  
     C:\path\to\x64\DLL
   

在VS.NET中重新加载项目之后,这些更改会使程序集参考对话框有点混乱,并且您可能会遇到有关使用错误目标处理器的程序集的一些警告,但所有构建都可以正常工作.

解决MSI问题接下来,不幸的是,这需要一个非VS.NET工具:我更喜欢Caphyon的高级安装程序,因为它拉出了所涉及的基本技巧(创建一个通用的MSI,以及32位和64位特定的MSI,并使用.EXE设置启动程序非常,非常好地提取正确的版本并在运行时执行所需的修正.

您可以使用其他工具或Windows Installer XML(WiX)工具集实现相同的结果,但Advanced Installer使事情变得如此简单(并且相当实惠),我从未真正考虑过替代方案.

有些事情你可能仍然需要WiX,即使使用Advanced Installer,也适用于.NET Installer Class自定义操作.尽管指定仅应在某些平台上运行的某些操作(分别使用VersionNT64和NOT VersionNT64执行条件)是微不足道的,但内置的AI自定义操作将使用32位框架执行,即使在64位计算机上也是如此.

这可以在将来的版本中修复,但是现在(或者当使用不同的工具来创建具有相同问题的MSI时),您可以使用WiX 3.0的托管自定义动作支持来创建具有适当位数的动作DLL将使用相应的框架执行.


编辑:自版本8.1.2起,Advanced Installer正确支持64位自定义操作.不幸的是,自从我的原始答案以来,它的价格已经增加了很多,尽管与InstallShield及其同类产品相比,它的价值仍然非常高......


编辑:如果您的DLL在GAC中注册,您也可以这样使用标准引用标记(以SQLite为例):


    


    

条件也减少到所有构建类型,发布或调试,并且只指定处理器体系结构.


需要一个非VS.NET工具:我更喜欢Caphyon的
仍然需要WiX,即使使用Advanced Installer,也适用于.NET Installer Class自定义操作.尽管指定仅应在某些平台上运行的某些操作(分别使用VersionNT64和NOT VersionNT64执行条件)是微不足道的,但内置的AI自定义操作将使用32位框架执行,即使在64位计算机上也是如此.

2> Tim Booker..:

假设您为两个平台构建了DLL,它们位于以下位置:

C:\whatever\x86\whatever.dll
C:\whatever\x64\whatever.dll

您只需要编辑您的.csproj文件:

C:\whatever\x86\whatever.dll

对此:

C:\whatever\$(Platform)\whatever.dll

然后,您应该能够针对两个平台构建项目,MSBuild将查找所选平台的正确目录.


不应该是: C:\ whatever\$(Platform)\ whatever.dll
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有