【问题标题】:Compiler error referencing Service Fabric Actor class from ASP.NET Core service从 ASP.NET Core 服务引用 Service Fabric Actor 类的编译器错误
【发布时间】:2017-06-26 19:00:01
【问题描述】:

这一直困扰着我一整天,我还没有弄清楚为什么会发生这种情况。

基本场景

  1. 使用 ASP.NET Core 服务创建了一个新的 Service Fabric 应用程序,并添加了对返回 MVC 视图的支持,以便它可以充当我的 SF 应用程序的 UI。

  2. 在创建UserActorUserActor.Interfaces 项目的解决方案中为用户添加了Actor 服务,并确保接口库按照SF 的要求以x64 为目标。

  3. 在 UserActor 上定义了一个 Task<UserProfile> GetProfileData() 方法,其中 UserProfile 类型是在 Interfaces 项目中定义的具有 [DataContract][DataMember] 属性的具体类,以便它可以被序列化(所有成员都是原语)。

  4. 从 ASP.NET Core 项目中添加了对 UserActor.Interfaces 的项目引用,以便我可以创建参与者代理并调用该方法。

  5. 在 ASP.NET Core Controller 类中添加了连接actor实例并调用GetProfileData方法的代码

此时,我收到以下编译器错误:

错误 CS0246:找不到类型或命名空间名称“UserProfile”(您是否缺少 using 指令或程序集引用?)

相关代码行如下:

using UserActor.Interfaces;

var user = ActorProxy.Create<IUserActor>( new ActorId( model.email ), FabricAppUrl );
UserProfile profile = user.GetProfileData().Result; // compiler error here

如果我将鼠标悬停在最后一行的 UserProfile 类型上,Visual Studio 会显示它会将类型视为 UserActor.Interfaces.UserProfile,并且不会在编辑器中显示任何错误。只有在我编译时才会出现此错误。

我在尝试返回原始类型时没有收到此错误,并且解析 Actor 代理的 IUserActor 接口也没有问题。

这是否与 Actor 项目是标准 .NET 项目和 ASP.NET Core 项目是使用 dotnet build 编译的事实有关(设置为 .NETFramework,Version =v4.5.2;不是 dotnet 核心)。

我还在构建输出中注意到 ASP.NET Core 项目正在构建为“调试任何 CPU”,而所有其他项目都设置为“调试 x64”。如果这是问题所在,我预计会收到关于架构类型不匹配的错误,但我也没有收到。

我该如何解决这个问题?我是否应该以不同的方式从 Actor 返回数据(例如 json 在将其作为字符串原语返回之前对其进行序列化)?

编辑 1:

上面的代码示例过于简单。我看到的 2 个编译器错误与传递给同一控制器中的辅助方法的类型有关,如下所示:

private bool TryGetUserProfile( LoginModel model, out UserProfile profile )
{
    var user = ActorProxy.Create<IUserActor>(new ActorId(model.Email), FarbicAppUrl);
    var profile = user.GetProfileData().Result;

    return !string.IsNullOrEmpty(profile.Name);
}

【问题讨论】:

  • 您是否尝试将 UserProfile 替换为 var
  • UserProfile 类是否标记为公开?
  • @kalten using var sorta 有帮助,但编译器调用的行是我尝试将类型传递给同一控制器中的另一个方法的地方(上面的示例有所简化)。在我的问题中添加了另一个示例。
  • @LoekD 是的,该类是一个标准的公共类,其构造函数(不是默认值)以[DataContract] 为属性,多个 get/set 自动属性为[DataMember]
  • 你在project.json中有这个吗? "运行时":{ "win10-x64":{} },

标签: c# asp.net-core azure-service-fabric


【解决方案1】:

好的,在另一台机器上启动整个场景后,我发现了问题所在,并认为这是 Microsoft 工具问题。以下是重现问题的步骤以及需要采取的纠正措施。

  1. 创建一个新的 Service Fabric 项目并选择 ASP.NET Core 作为服务。如果出现提示,请选择 Web 应用程序模板(但我认为如果您也选择了 Empty 或 Web API 模板,这将是一个问题)。如果您对此进行调试,它将正常工作(前提是您有本地集群设置)。

  2. 向解决方案添加新的 Actor 服务。这将为您创建 UserActorUserActor.Interfaces 项目。如果此时尝试编译,会收到如下错误信息:

C:\Program Files (x86)\MSBuild\bin\Microsoft.Common.CurrentVersion.targets(724,5):错误:未为项目“UserActor.Interfaces.csproj”设置 OutputPath 属性。请检查以确保您为此项目指定了有效的配置和平台组合。配置='调试'平台='AnyCPU'。如果其他项目试图遵循对此项目的项目到项目引用,此项目已卸载或未包含在解决方案中,并且引用项目未使用相同或等效项构建,则也可能出现此错误配置或平台。

检查配置管理器显示该项目只定义了一个“x64”目标。要解决此问题,请使用配置管理器并添加一个新的“AnyCPU”目标并将其从“x64”目标复制。由于 Service Fabric 需要 x64 程序集,因此请确保在关闭配置管理器之前仍将接口项目的目标平台设置为“x64”。

  1. 现在编译时会收到以下错误信息:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets(262,5):错误:C:\...\Web错误 CS0006:找不到元数据文件“C:\...\UserActor.Interfaces\bin\Debug\UserActor.Interfaces.dll”。

这里的线索是 Web 项目正在查找为“AnyCPU”目标定义的 OutputPath 位置,而不是为“x64”目标定义的位置 (bin\x64\Debug)。如果您手动编辑接口项目文件并将“AnyCPU”目标的 OutputPath 设置为与“x64”目标相同的路径,则一切都将正确编译。

您还可以部署项目,一切都会正常运行。我不确定 Microsoft 的哪个目标文件存在问题,但可能两者都有。我会考虑将此作为一个错误与 Microsoft 一起报告,以期得到解决(仍然存在于 2017 年 2 月 3 日发布的最新 SDK 中)。

我找不到 UserProfile 类型的原因是因为我之前使用错误的 OutputPath 集构建了解决方案之前我将 UserProfile 类添加到项目中,所以MSBuild 正在查看的已编译 DLL 不包含该类型。如果我从解决方案中删除了 bin 和 obj 文件夹,那么问题出在哪里就会变得很明显。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2018-09-15
    • 2017-09-02
    • 2017-01-31
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2016-03-11
    相关资源
    最近更新 更多