关于如何为多目标设置我的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中解决?
任何想法和/或建议都会受到欢迎.
是的,您可以在同一个项目中使用相同的代码库同时定位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为例):
条件也减少到所有构建类型,发布或调试,并且只指定处理器体系结构.
假设您为两个平台构建了DLL,它们位于以下位置:
C:\whatever\x86\whatever.dll C:\whatever\x64\whatever.dll
您只需要编辑您的.csproj文件:
C:\whatever\x86\whatever.dll
对此:
C:\whatever\$(Platform)\whatever.dll
然后,您应该能够针对两个平台构建项目,MSBuild将查找所选平台的正确目录.