我有一个小小的困境如何设定了我的visual studio建立用于多目标。

背景:c#。净v2。0p/援引入的第3次缔约方32位DLL的,SQL紧凑v3。5SP1,与一个安装项目。现在,该平台的目标是设x86使它能够运行,在Windows64.

3缔约方的公司刚刚释放了64位版本的DLL是我想要建立一个专门的64位的程序。

这就提出了一些问题,我没有答案。我想有相同的码基础。我必须建立有提到无论是32位的组DLL的或64位DLL。(这两个第3方和SQL服务器的契约)

这可以解决了2个新设置的构造(Debug64和Release64)?

我必须创建2个单独的安装项目(标准。visual studio项目,没有维克斯或任何其他实用工具),或者这可以解决的内的相同。msi?

任何想法,和/或建议将受到欢迎。

有帮助吗?

解决方案

是的,你可以的目标x86和64用相同的码基于同样的项目。在一般情况下,事情只会的工作,如果你创造合适的解决方案配置在VS.NET (虽然P/调用到完全不受管Dll将最有可能需要某些条件代码):的项目,我发现需要特别关注的是:

  • 参考文献以外管理的组件名称相同,但他们自己的具体位(这也适用于COM互操作程序集)
  • MSI包(其中,正如已经指出的,将需要为目标x86或64)
  • 任何习俗。净安装基于类行动在你MSI包

大会参考问题不能完全解决了VS.NET,因为它将只允许添加一个参与给定名称的一个项目一次。要解决这个问题,编辑项目文件手动(在VS,右侧击你的项目文件中的方案资源管理器,选择卸载项目,然后右再次点击和选择编辑).之后添加一个参考,也就是说,x86版的组件、项目文件将包含这样的:

<Reference Include="Filename, ..., processorArchitecture=x86">
  <HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>

包裹,参照标记内部的一项组进行标记指示的解决方案配置适用于,e。g:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
   <Reference ...>....</Reference>
</ItemGroup>

然后,复制和粘贴到整个项组进行标记和编辑,以使其包含的详细信息64位问题,例如:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
  <Reference Include="Filename, ..., processorArchitecture=AMD64">
     <HintPath>C:\path\to\x64\DLL</HintPath>
   </Reference>
</ItemGroup>

后重新装入你的项目VS.NET大会参考对话会有点困惑过的这些变化,并可能遇到的一些警告有关的程序集错误的目标处理,但所有你的建立会工作得很好。

解决MSI问题是接下来,不幸的是这个 需要一个non-VS.NET 工具:我更喜欢Caphyon的 先进的安装者 为此目的,因为它拉断基本的技巧参与(建立一个共同MSI,以及32位和64位的具体Msi,并使用。可执行软件安装发射器中提取的正确版本,并做必要的修正在运行时)非常,非常好。

你也许可以实现相同结果,使用其他工具或 窗户安装XML(维克斯)工具, 但先进的安装使得事情这么容易(而且是相当负担得起的,在那),我从来没有真正看着的替代方案。

有一件事你 仍然需要维克斯虽然,即使在使用先进的安装,是为你的。净安装类定义的行动。虽然这是琐碎的指定某些行动应只在某些平台(使用VersionNT64和不VersionNT64执行条件下,分别),内AI定义的行动将执行使用的32位的框架,甚至64位的机器。

这可以是固定在一个未来的版本,但现在时(或者当使用不同的工具来为你Msi具有相同的问题),可以使用维克斯3.0管理的定义操作支持,以创建行动Dll有适当的位数,将被执行的,使用相应的框架。


编辑:尽的版本8.1.2,先进的安装程序的正确支持64位定义的行动。因为我原来的答复,其价格增加了相当一点,不幸的是,尽管它仍然极其良好的价值时相比,安装和它的家族...


编辑:如果你Dll登记在册的咨询委员会还可以使用的标准的参考标签这样的方式(源码作为实例):

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
    <Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>

本条件,也是减下来的所有建立类型、释放或者调试,以及只是指定处理架构。

其他提示

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

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

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

<HintPath>C:\whatever\x86\whatever.dll</HintPath>

对此:

<HintPath>C:\whatever\$(Platform)\whatever.dll</HintPath>

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

不确定问题的总答案 - 但我想在 displaylang = en“rel =”nofollow noreferrer“> SQL Compact 3.5 SP1下载页面,看到你正在寻找x64 - 希望它有所帮助。

  

由于SQL Server Compact的变化   SP1和其他64位版本   支持,集中安装和混合   模式环境的32位版本   SQL Server Compact 3.5和64位   SQL Server Compact 3.5 SP1的版本   可以创造出似乎是什么   间歇性的问题。尽量减少   冲突的可能性,并使   平台中立部署托管   客户端应用程序,集中   安装64位版本的SQL   Server Compact 3.5 SP1使用   Windows Installer(MSI)文件也   需要安装32位版本   SQL Server Compact 3.5 SP1 MSI   文件。仅适用于应用程序   需要本机64位,私有   部署64位版本   SQL Server Compact 3.5 SP1可以   使用。

我读这是<!>“;包括32位SQLCE文件以及 64位文件<!>”;如果分发给64位客户端。

让生活变得有趣我猜...必须说我喜欢<!>“这似乎是间歇性的问题<!>”; line ...听起来有点像<!>你想象的东西,但为了以防万一,这样做...... <!>

关于你的上一个问题。很可能你不能在一个MSI内解决这个问题。 如果您正在使用注册表/系统文件夹或任何相关的文件夹,MSI本身必须知道这一点,您必须准备64位MSI才能在32位计算机上正确安装。

有可能您可以将产品作为32位应用程序安装,并且仍然可以将其作为64位应用程序运行,但我认为这可能有点难以实现。

据说,我认为你应该能够为所有事情保留一个代码库。在我目前的工作场所,我们设法做到了。 (但它确实花了一些时间来让所有东西一起玩)

希望这会有所帮助。 以下是与32/64位问题相关的一些信息的链接: http://blog.typemock。 COM / 2008/07 /注册表上 - 窗口64位双your.html

如果您使用.NET编写的自定义操作作为MSI安装程序的一部分,那么您还有另一个问题。

运行这些自定义操作的“shim”始终为32位,然后您的自定义操作也将运行32位,无论您指定的目标是什么。

更多信息<!> amp;一些忍者移动到周围(基本上改变MSI使用这个垫片的64位版本)

在Visual Studio 2005/2008中构建MSI以在SharePoint 64上工作

使用Visual Studio进行64位托管自定义操作

您可以不同地生成两个解决方案,然后合并它们! 我为VS 2010做了这个。它有效。我有两个不同的解决方案由CMake生成,我合并了它们

您可以对项目文件中的dll引用使用条件 ItemGroup
这将导致visual studio在您更改活动配置时重新检查条件和引用 只需为每个配置添加一个条件。

示例:

 <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <Reference Include="DLLName">
      <HintPath>..\DLLName.dll</HintPath>
    </Reference>
    <ProjectReference Include="..\MyOtherProject.vcxproj">
      <Project>{AAAAAA-000000-BBBB-CCCC-TTTTTTTTTT}</Project>
      <Name>MyOtherProject</Name>
    </ProjectReference>
  </ItemGroup>

一个。净建立与x86/64依赖关系

虽然所有其他的答案给你一个解决方案做出不同的建立根据的平台,我给你一个选项只有"AnyCPU"配置并作出建立工作与x86和64dll。

你必须要写一些管道的代码这一点。我不能让这一工作与应用程序。config。如果别人知道一种方法来解决它通过应用程序。config我真的想知道。

决议正确x86/64-dll在运行时

步骤:

  1. 使用AnyCPU在csproj
  2. 如果你决定只参照x86或64dll在你csprojs.适应UnitTests设置的建筑设置你有选择的。重要的是调试/运行测试的内部visual studio.
  3. 在参考性质的设定 复制地方 & 具体版本
  4. 摆脱建筑的警告,通过加入这一行的第一次 属性组进行 在所有的你的csproj文件,你参考x86/64:<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
  5. 加入这个脚本生成后到启动项目、使用和修改的道路这个脚本sp,它将所有x86/64dll在对应的子文件夹的建立bin\x86\bin\64\

    xcopy /E /H /R /Y /I /D $(SolutionDir)\YourPathToX86Dlls $(TargetDir)\x86 xcopy /E /H /R /Y /I /D $(SolutionDir)\YourPathToX64Dlls $(TargetDir)\x64

    -->的时候你会开始应用程序现在,你会得到一个异常 大会不能被发现。

  6. 登记册的AssemblyResolve事件正在开始你的应用的进入点

    AppDomain.CurrentDomain.AssemblyResolve += TryResolveArchitectureDependency;
    

    withthis方法:

    /// <summary>
    /// Event Handler for AppDomain.CurrentDomain.AssemblyResolve
    /// </summary>
    /// <param name="sender">The app domain</param>
    /// <param name="resolveEventArgs">The resolve event args</param>
    /// <returns>The architecture dependent assembly</returns>
    public static Assembly TryResolveArchitectureDependency(object sender, ResolveEventArgs resolveEventArgs)
    {
        var dllName = resolveEventArgs.Name.Substring(0, resolveEventArgs.Name.IndexOf(","));
    
        var anyCpuAssemblyPath = $".\\{dllName}.dll";
    
        var architectureName = System.Environment.Is64BitProcess ? "x64" : "x86";
    
        var assemblyPath = $".\\{architectureName}\\{dllName}.dll";
    
        if (File.Exists(assemblyPath))
        {
            return Assembly.LoadFrom(assemblyPath);
        }
    
        return null;
    }
    
  7. 如果你有单元的测试做一个TestClass有一个方法,该方法具有一个AssemblyInitializeAttribute和也注册上述TryResolveArchitectureDependency处理程序。(这不会被执行,有时如果你行个测试的内部visual studio,参考文献将得到解决,不从该单元测试站。因此决定在第2步是重要的。)

福利:

  • 一个安装/建立两个平台

缺点:-没有错误,在编制时间x86/64dll不匹配。-你还是应该运行检验在这两种模式!

选择创建的第二个可执行的,专为64架构Corflags.exe 在脚本生成后

其他的变种尝试出:-你不会需要AssemblyResolve事件处理程序,如果你保证,否则,dll获得拷贝二进制文件夹在开始(评估进程建筑-->动应dll64/x86到文件夹和回。) -在评估安装建筑和删除的二进制文件对于错误的结构和移动的权利的那些站的文件夹。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top