Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编译引用C+;的C#项目时,MSBuild无法生成+/x86中的clidll_C#_C++_Visual Studio 2010_Msbuild - Fatal编程技术网

在编译引用C+;的C#项目时,MSBuild无法生成+/x86中的clidll

在编译引用C+;的C#项目时,MSBuild无法生成+/x86中的clidll,c#,c++,visual-studio-2010,msbuild,C#,C++,Visual Studio 2010,Msbuild,我正在使用VS2010和.NET4.0 我有两个小项目A和BA是一个C++/CLI DLL项目,B是一个引用A的C#EXE项目。两者都必须在x86中编译,因为A使用x86本机dll 当我用VS2010 IDE构建B时,B编译得很好。接下来,我尝试使用以下命令行使用MSBuild构建B MSBuild B.csproj/property:Platform=x86;配置=发布 它失败了,出现以下错误 “A.vcxproj”(默认目标)(16)->(InvalidPlatformError目标)->

我正在使用VS2010和.NET4.0

我有两个小项目ABA是一个C++/CLI DLL项目,B是一个引用A的C#EXE项目。两者都必须在x86中编译,因为A使用x86本机dll

当我用VS2010 IDE构建B时,B编译得很好。接下来,我尝试使用以下命令行使用MSBuild构建B

MSBuild B.csproj/property:Platform=x86;配置=发布

它失败了,出现以下错误

A.vcxproj”(默认目标)(16)->(InvalidPlatformError目标)-> C:\ProgramFiles(x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.InvalidPlatform.Targets(23,7): 错误MSB8007:项目“A.vcxproj”的平台无效。平台='x86'。 您可能会看到此消息,因为您正在尝试构建一个没有 一个解决方案文件,并指定了此项目不存在的非默认平台。[A.vcxproj]

这似乎是因为C++/CLI使用“Win32”作为平台名,而C#使用“x86”。因此,当我指定“x86”时,它无法构建A。如果“Win32”,则无法生成B


由于自动生成,我必须使用MSBuild。B的默认平台固定为AnyCPU(我无法更改它),因此我无法使用默认平台技巧,在使用MSBuild构建时必须指定“x86”。我该怎么做?是否有任何方法可以更改平台名称,或者使用MSBuild的更好方法?我能在不使用默认平台的情况下做到这一点吗?

对于这一点,我看不到任何解决方法,除了用可以与本机x86 dll接口并编译为“AnyCPU”(不确定您受什么dll限制)的内容替换它,从而删除A对本机x86 dll的依赖关系。基本上,我的理解是,win32意味着它可以在比x86编译程序更多的处理器上运行,因此从MSbuild的角度来看,它们不兼容。如果您为平台指定“AnyCPU”,会发生什么情况?

如果您有一个包含这两个项目的解决方案并正确设置了它,那么您应该能够使用msbuild构建该解决方案(假设该解决方案将首先使用Win32构建a,然后使用x86构建B)


另一个选项是不从B引用项目A,您只需添加一个引用A的输出dll。为此,首先确保A.dll与B.exe位于同一目录中。然后通过浏览到输出目录并选择a.dll来添加对项目B的引用。还可以将“Copy Local”设置为false,因为不需要这样做。

刚刚找到了一种有趣的方法来解决这个问题:使用一些自定义XML扩展.csproj文件,以便正确构建依赖的.vcxproj

为了防止链接失效,这里是重要的部分。我不知道为什么,也不知道它是如何工作的,但它为我完成了任务

<Target Name="PrepProjectConfiguration" BeforeTargets="PrepareForBuild" Condition="'$(Platform)' == 'x86'">
   <AssignProjectConfiguration
         CurrentProjectConfiguration="$(Configuration)"
         CurrentProjectPlatform="$(Platform)"
         ProjectReferences="@(ProjectReference)"
         ResolveConfigurationPlatformUsingMappings="true">
      <Output TaskParameter="AssignedProjects" ItemName="ProjectReferenceWithConfiguration" />
   </AssignProjectConfiguration>
   <ItemGroup>
      <ProjectReference Remove="@(ProjectReferenceWithConfiguration)" />
   </ItemGroup>
   <Message Text="  regular reference %(ProjectReference.Identity)" />
   <Message Text="re-mapped reference %(ProjectReferenceWithConfiguration.Identity) - %(ProjectReferenceWithConfiguration.Configuration)|%(ProjectReferenceWithConfiguration.Platform)" />
</Target>


提到的A使用的x86本机dll是外部dll,仅在x86中受支持。如果B内置在任何CPU中,并在x64操作系统中执行,它将作为x64加载,并且不会使用x86本机dll。实际上,B甚至可能不会加载sinec,因为它找不到A的x64版本或它的本机依赖性。C#项目的平台名称毫无意义,您可以随意命名它。只有平台目标设定才重要。如果你不能改变一个毫无意义的名字,那么它就到此为止了。但你确实需要解释为什么建设项目B也会建设项目A。这只能在生成解决方案时发生,而不能在生成项目时发生。@HansPassant,因为项目B引用了项目a。该信息包含在.csproj文件中,因此MSBuild尝试首先生成解决方案。我真的找不到可以在哪里更改C#项目的平台名称。。除了直接编辑.csproj文件,这可能会有一些潜在的问题或副作用。第二个建议似乎有点困难,因为直接生成.sln的输出路径可能与使用msbuild的输出路径不同。第一个看起来很合理,但我决定使用默认平台技巧,因为它更简单。无论如何,谢谢你。