【问题标题】:Visual Studio showing errors when referencing external assemblies in UnityVisual Studio 在 Unity 中引用外部程序集时显示错误
【发布时间】:2018-12-03 16:01:48
【问题描述】:

这基本上是我昨天发布的this question 之后的一个后果问题。长话短说,我在 Unity 应用程序中引用 System.ServiceModel 时遇到了麻烦,我通过使用 mcs.rsp file 解决了这个问题:

-r:System.ServiceModel.dll

通过将Scripting Runtime VersionApi Compability Level 设置与.NET 4.x 对齐。但是,现在我面临另一个问题。

Unity 项目构建良好!

所以,首先让我指出我的项目运行良好,没有编译错误。所以在这方面它很好。我面临的问题是我在 Visual Studio 中遇到的烦恼并影响了我的开发体验。

Visual Studio 中的错误

基本上,当我在 Visual Studio 中打开 C# 项目时,我会收到如下类型的错误:

即使程序集 System.ServiceModel 现在已正确加载项目中,Visual Studio 仍向我显示错误,抱怨这些突出显示的类型不可用。

找不到类型或命名空间“ServiceHost”(是否缺少 using 指令或程序集引用?)

为什么?这在开发时非常烦人,我不可能在整个开发过程中出现这样的虚假错误:(

更多信息...

如果我检查生成的项目文件Assembly-CSharp.csproj,我可以看到:

<Reference Include="System.ServiceModel.Duplex">
    <HintPath>C:/Program Files/Unity/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Http">
   <HintPath>C:/Program Files/Unity/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.NetTcp">
    <HintPath>C:/Program Files/Unity/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Primitives">
    <HintPath>C:/Program Files/Unity/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel.Security">
    <HintPath>C:/Program Files/Unity/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll</HintPath>
</Reference>

所以这让我想知道:

  • 似乎 Unity 指向所需 dll 的单声道生成 dll。但是System.ServiceModel.dll在哪里?
  • 我可以看到System.ServiceModel.dll在包含Facades的文件夹中,为什么没有使用?

【问题讨论】:

  • Mono 对 WCF 的支持是“有限的”,如果你正在使用 System.ServiceModel mono-project.com/docs/about-mono/compatibility
  • @User453465436754:是的,我明白了:(但我想知道开发者如何在 Unity 中实现在线游戏。他们如何操作远程玩家之间的通信?
  • 游戏使用非常高效的网络精益;与任何 SOAP 相比,快速且通常是专有的(这没有错)协议;休息;或 Protobuf 必须提供,因此不依赖 System.ServiceModel.dll
  • 最好的办法是查看gamedev。通常,您会发现窥视者使用 IP 数据报进行广播和更快的方面
  • 对于这个特定的错误,checkout stackoverflow.com/questions/24040904/…

标签: c# visual-studio unity3d


【解决方案1】:

您收到错误是因为您没有使用正确的 dll。要使用 System.ServiceModelSystem.ServiceModel.Description 命名空间中的任何内容,您必须引用 Unity 随附的正确单声道 dll。

首先,将 Scripting Runtime VersionApi Compatibility Level 更改为 4.x.NET 4.6 等效项(选项取决于 Unity 版本)。

在我的电脑上转到&lt;UnityInstallationDirectory&gt;\Editor\Data\MonoBleedingEdge\lib\mono\4.5 或例如C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\4.5

进入该目录后,将System.ServiceModel.dll 复制到您的&lt;Project&gt;\Assets 路径,您应该可以使用ServiceHostServiceEndpoint API。

您可能仍然会遇到运行时错误或异常,因为这是单声道,但这应该可以解决您当前的编译时错误。 在执行此答案中的操作之前,不要忘记撤消您在问题中已经完成的操作。

【讨论】:

  • 引用Doc:“你应该引用上面示例中描述的类库程序集。不要将它们复制到项目目录中。”
  • 我想在开始时编辑评论,因为我很生气这不起作用,但 StackOverflow 不允许在 5 分钟后更改 cmets。我真的欠你为那些第一句话道歉。我想将它们更改为:“不幸的是,这不是我正在寻找的解决方案”。请接受我的无礼道歉!严重地。再说一次,我很沮丧,因为我整天都在这上面。非常非常抱歉。
  • 话虽如此,我想说的是,出于愤怒而抱歉,这可能不是这里的最佳做法。不幸的是,我不是在寻找黑客,而是在寻找最佳实践。我只是认为当知道当前配置文件不支持某组程序集时,Unity 不引用正确的 dll 是很奇怪的。 System.ServiceModel dll 也有不同的版本,比如 3.5 版。如果不完全支持 4.x 中的那个,他们可以生成项目来引用支持的那个。除非根本不支持 WCF,否则就是这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多