在我看来,您的问题存在只是因为您选择了控制台应用程序而不是“ASP.NET Web 应用程序”/“ASP.NET 5 模板”/“空”。我做了简单的测试使用空模板,"Google.Protobuf": "3.0.0-alpha4"
从 NuGet 添加,最后只是修改Startup.cs
,以便它使用Google.Protobuf.WellKnownTypes
:
- 添加
using Google.Protobuf.WellKnownTypes;
- 添加
var duration = new Duration { Seconds = 100, Nanos = 5555 };
在里面Configure
- 修改
await context.Response.WriteAsync("Hallo World!");
为await context.Response.WriteAsync(duration.ToString());
的最终代码Startup.cs
:
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.Extensions.DependencyInjection;
using Google.Protobuf.WellKnownTypes;
namespace ProtobufTest
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler();
var duration = new Duration { Seconds = 100, Nanos = 5555 };
app.Run(async context =>
{
await context.Response.WriteAsync(duration.ToString());
});
}
// Entry point for the application.
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}
}
生成的 ASP.NET 5 应用程序成功显示100.5555s
在 Web 浏览器中。
您可以从这里下载演示项目。
更新:我分析了纯控制台 DNX 应用程序的问题,它使用代码并可以在方法中找到问题的原因,该duration.ToString()
方法适用于 ASP.NET 环境,但不适用于纯控制台应用程序。问题的原因很有趣,我正在尝试调查,但我想与其他人分享我目前的结果
我可以使用以下代码:
using Google.Protobuf.WellKnownTypes;
using System;
namespace ConsoleApp3
{
public class Program
{
public static void Main(string[] args)
{
var duration = new Duration { Seconds = 100, Nanos = 5555 };
Console.WriteLine("{0}.{1:D4}s", duration.Seconds, duration.Nanos);
}
}
}
可以从这里下载工作项目。
我另外评论了这一行
//[assembly: Guid("b31eb124-49f7-40bd-b39f-38db8f45def3")]
在AssemblyInfo.cs
没有不必要的参考"Microsoft.CSharp"
,其中有很多其他的参考。project.json
演示项目中的包含:
{
...
"dependencies": {
"Google.Protobuf": "3.0.0-alpha4"
},
"frameworks": {
"dnx451": { },
"dnxcore50": {
"dependencies": {
"System.Console": "4.0.0-beta-23516"
}
}
}
}
顺便说一句,包括"System.Console": "4.0.0-beta-23516"
部分"dnxcore50"
是"frameworks"
必需的,因为Console
命名空间(for Console.WriteLine
)存在于mscorlib
of 中DNX 4.5.1
。如果尝试添加常见"System.Console": "4.0.0-beta-23516"
依赖项的级别,则会收到以文本开头的错误
错误 CS0433 类型“Console”存在于“System.Console,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”和“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”ConsoleApp3.DNX 4.5.1
更新2:一个可以替换线
Console.WriteLine("{0}.{1:D4}s", duration.Seconds, duration.Nanos);
至
Console.WriteLine((object)duration);
让它工作。只是使用Console.WriteLine(duration);
或var str = duration.ToString();
产生您描述的错误。
更新 3:我验证了代码duration.ToString()
调用了使用这些行进行格式化的行。似乎代码duration.ToString()
确实与类型(如)相同((object)duration).ToString()
。WellKnownTypes
Duration
我认为重要的最新评论。所描述的问题仅存在于 dnx451(或 dnx452 或 dnx46)。如果有人会删除这些线条
"dnx451": { },
从那时起"frameworks"
,project.json
该程序将仅针对 DNX Core 5.0 进行编译 ( "dnxcore50"
)。人们可以很容易地验证一个人不会再有任何问题。
更新4:最后我找到了解决您问题的非常简单的方法:只需"Microsoft.AspNet.Hosting": "1.0.0-rc1-final"
向项目添加依赖项即可:
{
"dependencies": {
"Google.Protobuf": "3.0.0-alpha4",
"Microsoft.AspNet.Hosting": "1.0.0-rc1-final"
}
}
它会加载许多不需要的 dll,但现在将正确解决依赖关系。
对于 dnx451 和 dnxcore50 ,最终项目可以毫无问题地编译。我将结果解释如下:“Google.Protobuf”确实适用于 dnx451 和 dnxcore50,但 RC1 的自动依赖关系解析仍然存在问题,它无法正确解析“Google.Protobuf”的一些必需依赖项。
当然,直接添加不需要"Microsoft.AspNet.Hosting": "1.0.0-rc1-final"
的引用只能被视为一种解决方法。我认为 ASP.NET 5 和 DNX 中使用的依赖解析仍然存在问题。我在问题之前发布了一段时间,该问题仍然处于打开状态。该问题提供了一个示例,当直接包含的依赖项的解析可以提供另一个结果,因为依赖项由dnu restore
. 这就是我开始比较工作代码的依赖关系的原因,我最初将它与非工作项目的依赖关系发布给你。经过一些测试,我找到了解决方法并将其减少为唯一的依赖项:"Microsoft.AspNet.Hosting": "1.0.0-rc1-final"
.