Unity到Visual Studio:已导入多个具有等效标识的程序集

本文关键字:标识 程序集 Visual Studio 导入 Unity | 更新日期: 2023-09-27 17:58:27

我正在设计一个应用程序,使用Unity在Microsoft HoloLens上运行以进行用户交互。该应用程序连接到asmx Web服务以检索数据。

我有一个C#测试程序来测试Web服务的连接和数据检索。

然后,我遵循本教程生成了一个基于Web服务wsdl的dll(https://www.youtube.com/watch?v=AifcMzEbKnA)

如果使用以下脚本生成dll:

@echo off
if exist "Service.xml" (
del MyOwnWS.wsdl
echo Rename
rename Service.xml MyOwnWS.wsdl
echo.
)
echo WSDL
call wsdl MyOwnWS.wsdl -o:MyOwnWS.cs
echo.
echo DMCS
call dmcs /target:library MyOwnWS.cs -r:System.Web.Services,System.Data
echo.
echo Done

我添加了系统。数据,因为我的Web服务从数据库返回数据集数据。

我把dll放在Unity项目的Assets文件夹里了。我还不得不在其中删除System.Data.dll、System.dll和System.Web.Services.dll(从C:''Program Files''Unity Hololens 5.4.0b16-HTP''Editor''Data''Mono''lib''Mono''Unity文件夹中获取)

当我使用Unity编辑器时,我的应用程序会连接到Web服务并毫无问题地检索数据。

下一步,我遵循本教程制作了Unity的HoloLens应用程序(http://hololenshelpwebsite.com/Blog/EntryId/1006/HoloLens-Hello-World)

当它为他们自己的Hello World工作时,当我试图从unity构建我自己的项目时,我收到了以下错误:

错误CS1703:已存在多个具有等效标识的程序集已导入:"C:''Users''UserA''.nuget''packages''Microsoft.NETCore.Portable.Compatility''1.0.0''ref''netcore50''System.dll"answers"J:''Work''MyTestUnity''Assets''System.dll"。删除重复引用。版权所有(C)Microsoft Corporation。所有权利保留。Microsoft(R)Visual C#编译器1.3.1.60616版

因此,我在Editor下添加了一个ProjectFileHook.cs文件,其中包含以下内容:

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using UnityEditor;
using SyntaxTree.VisualStudio.Unity.Bridge;
using UnityEngine;
// http://forum.unity3d.com/threads/missing-c-references-to-system-data.11361/
// https://visualstudiogallery.msdn.microsoft.com/8d26236e-4a64-4d64-8486-7df95156aba9
[InitializeOnLoad]
public class ProjectFileHook
{
    // necessary for XLinq to save the xml project file in utf8
    class Utf8StringWriter : StringWriter
    {
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }
    }
    static void ProcessNodesWithIncludeAttribute(XDocument document, string localName, string includeValue, Action<XElement> action)
    {
        var nodes = document
            .Descendants()
            .Where(p => p.Name.LocalName == localName);
        foreach (var node in nodes)
        {
            var xa = node.Attribute("Include");
            if (xa != null && !string.IsNullOrEmpty(xa.Value) && string.Equals(xa.Value, includeValue))
            {
                action(node);
            }
        }        
    }
    // Remove System.Data from project (not from file system so Unity can compile properly)
    static void RemoveFileFromProject(XDocument document, string fileName)
    {
        ProcessNodesWithIncludeAttribute(document, "None", fileName, element => element.Remove());        
    }
    // Adjust references, by using the default framework assembly instead of local file (remove the HintPath)
    static void RemoveHintPathFromReference(XDocument document, string assemblyName)
    {
        ProcessNodesWithIncludeAttribute(document, "Reference", assemblyName, element => element.Nodes().Remove());        
    }
    static ProjectFileHook()
    {
        ProjectFilesGenerator.ProjectFileGeneration += (string name, string content) =>
        {
            var document = XDocument.Parse(content);
            RemoveFileFromProject(document, @"Assets'System.Data.dll");
            RemoveHintPathFromReference(document, "System.Data");
            RemoveFileFromProject(document, @"Assets'System.Web.Services.dll");
            RemoveHintPathFromReference(document, "System.Web.Services");
            RemoveFileFromProject(document, @"Assets'System.dll");
            RemoveHintPathFromReference(document, "System");
            var str = new Utf8StringWriter();
            document.Save(str);
            return str.ToString();
        };
    }
}

但这看起来毫无作用。

我现在不知道如何解决这个问题,我真的需要专家的帮助来解决。

Unity到Visual Studio:已导入多个具有等效标识的程序集

所以。。。看起来我们不能再像那样使用WSDL Web服务了。不久前,微软在一次更新中放弃了对它的支持。我看了很多关于它的文章,但我忘了留一个书签。因此,如果你想查找它,你必须查看WUP文档。

相反,我们最终使用UnityWebRequest和Coroutines来处理Web服务通信。

我们还必须更新网络服务以启用Get/post呼叫。