我遇到一个问题,我一直在Monogame和XNA库之间出现歧义错误。无论我做什么,我都无法编译。我已经从我的计算机上删除了XNA,但错误仍然存在。完整的错误是:
Error 4 Argument 1: cannot convert from 'Microsoft.Xna.Framework.Vector2 [c:\Program Files (x86)\MonoGame\v3.0\Assemblies\WindowsPhone\x86\MonoGame.Framework.dll]' to 'Microsoft.Xna.Framework.Vector2'
在以下行上:
EngineGlobal.world = new World(new Vector2(0,9.8f), false);
有没有人对如何摆脱冲突有任何建议?我想继续开发monogame而不是XNA,因为代码将被移植到Android,iPhone等的MonoGame环境中。
非常感谢任何帮助!
答案 0 :(得分:4)
我的回复有点晚了,但如果你看看MonoGame项目模板做了什么,你会发现在csproj文件中定义了一个额外的构建目标。
在我的情况下添加:
<Target Name="MonoGame_RemoveXnaAssemblies" AfterTargets="ImplicitlyExpandTargetFramework">
<Message Text="MonoGame - Removing XNA Assembly references!" Importance="normal" />
<ItemGroup>
<ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.dll'" />
<ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.GamerServices.dll'" />
<ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.GamerServicesExtensions.dll'" />
<ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.Input.Touch.dll'" />
<ReferencePath Remove="@(ReferencePath)" Condition="'%(Filename)%(Extension)'=='Microsoft.Xna.Framework.MediaLibraryExtensions.dll'" />
</ItemGroup>
带有ambigious引用的csproj解决了这个问题。
答案 1 :(得分:0)
这种错误几乎总是与引用有关。如果你绝对肯定它没有引用XNA,它可能会引用不同版本的MonoGame。
尝试从所有项目中删除所有MonoGame和XNA引用并重新引用它们。这包括已使用XNA编译的项目。它们可能需要重新编译。
答案 2 :(得分:0)
据我所知,Farseer已被编写在多个平台上工作。它通过条件编译完成了这个(部分)。
我注意到在Farseer解决方案中重新定义了几个XNA类型,但是使用了原始的Microsoft XNA命名空间。
这通常不是问题,因为这些定义被排除在XNA桌面,Windows Phone和XBox等平台上。
但是,当Farseer与意外平台一起使用时,这确实成为一个问题:MonoGame。
为了解决这个问题,我只需下载源代码并使用XNA重新定义删除文件。
如果您正在使用源代码,则应该能够通过定义以下条件编译符号中的任何一个来阻止编译这些定义:
XNA
WINDOWS_PHONE
XBOX
ANDROID
这可以在项目的属性的构建标签中完成。
甚至更好,定义一个MONOGAME
符号并将其添加到条件编译行:
#if !XNA && !WINDOWS_PHONE && !XBOX && !ANDROID && !MONOGAME