.net 没有框架程序集,无法解决程序集引用问题
我正在尝试验证ASP.NET团队的新的可移植运行时以及理想情况下的大多数其他现代环境是否能够正常工作。3.0.0-alpha4版本是不久前使用profile259创建的,因此我希望在某些情况下需要进行一些更改,但我想我会尝试一下。我意识到,并期望必须对进行一些更改,但我遇到的错误让我难堪 DNX版本:1.0.0-rc1-update1 我当前尝试测试的场景是一个以dnx451为目标的控制台应用程序。我有一个非常简单的示例应用程序:.net 没有框架程序集,无法解决程序集引用问题,.net,nuget,dnx,nuspec,.net,Nuget,Dnx,Nuspec,我正在尝试验证ASP.NET团队的新的可移植运行时以及理想情况下的大多数其他现代环境是否能够正常工作。3.0.0-alpha4版本是不久前使用profile259创建的,因此我希望在某些情况下需要进行一些更改,但我想我会尝试一下。我意识到,并期望必须对进行一些更改,但我遇到的错误让我难堪 DNX版本:1.0.0-rc1-update1 我当前尝试测试的场景是一个以dnx451为目标的控制台应用程序。我有一个非常简单的示例应用程序: using Google.Protobuf.WellKnownT
using Google.Protobuf.WellKnownTypes;
using System;
public class Program
{
public static void Main(string[] args)
{
Duration duration = new Duration { Seconds = 100, Nanos = 5555 };
Console.WriteLine(duration);
}
}
。。。还有一个小小的project.json
:
{
"compilationOptions": { "emitEntryPoint": true },
"dependencies": { "Google.Protobuf": "3.0.0-alpha4" },
"frameworks": {
"dnx451": { }
}
}
请注意,我甚至没有在这里使用dnxcore*
——讽刺的是,我可以毫无问题地使用它
dnu恢复
工作正常<代码>dnx运行失败,原因是:
错误:c:\Users\Jon\Test\Projects\protobuf coreclr\src\ProtobufTest\Program.cs(9,9):DNX,Version=v4.5.1错误CS0012:在未引用的程序集中定义了类型“Object”。必须添加对程序集“System.Runtime,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用
以下更改会导致相同的错误:
- 显式地将依赖项添加到框架的
依赖项部分的
“System.Runtime”:“4.0.0”
- 显式地将依赖项添加到框架的
依赖项部分的
,同样,对于“System.Runtime”:“4.0.0-beta-23109”
、4.0.10-beta-*
和4.0.20-beta-*
4.0.21-beta*
- 将依赖项添加到NuGet包(本地)中的
,并根据该-System.Runtime
进行重建已更新,以包括System.Runtime v4.0.0,但发生了相同的错误project.lock.json
- 同上,包括包中的
目录以及依赖项lib\dotnet
依赖项
条目),但让我感到困惑:
- 将
调用更改为仅Console.WriteLine
(但无其他更改)Console.WriteLine(“foo”)
- 将
变量的类型更改为持续时间
,而不是对象
持续时间
- 完全删除协议缓冲区的所有提示,而是使用
或类似方法TimeSpan
- 将以下内容添加到
部分的project.json中:dnx451
"frameworkAssemblies": { "System.Runtime": "" }
我希望,如果我能找到一种方法使
依赖项
条目起作用,那么我就可以将该依赖项添加到协议缓冲区本身,这很好——但由于project.lock文件中的System.Runtime v4.0.0依赖项似乎没有帮助,我一定缺少了一些东西:(在我看来,您的问题之所以存在,只是因为您选择了控制台应用程序而不是“ASP.NET Web应用程序”/“ASP.NET 5模板”/“空”。我将简单的测试用法设置为空模板,添加了“Google.Protobuf”:“3.0.0-alpha4”
来自NuGet,最后修改了Startup.cs
,使其使用Google.Protobuf.WellKnownTypes
:
- 使用Google.Protobuf.WellKnownTypes添加了
,
- 添加了
在var duration=new duration{Seconds=100,Nanos=5555};
Configure
- 将
修改为wait context.Response.WriteAsync(“你好!”);
wait 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);
}
}
可以从下载工作项目。
我对这行加了评论
//[assembly: Guid("b31eb124-49f7-40bd-b39f-38db8f45def3")]
在AssemblyInfo.cs
中,没有不必要的引用“Microsoft.CSharp”
,其中有许多其他引用。project.json
包含在演示项目中:
{
...
“依赖项”:{
“Google.Protobuf”:“3.0.0-alpha4”
},
“框架”:{
“dnx451”:{},
“dnxcore50”:{
“依赖项”:{
“系统控制台”:“4.0.0-beta-23516”
}
}
}
}
顺便说一句,包括“System.Console”:中的“4.0.0-beta-23516”
“dnxcore50”
部分“frameworks”
是必需的,因为Console
命名空间(用于Console.WriteLine
)存在于DNX 4.5.1
的mscorlib
中。如果试图添加“System.Console:“4.0.0-beta-23516”
在常见依赖项级别上,一个错误是从文本开始的
错误CS0433“System.Console”和“System.Console”中都存在“Console”类型,
版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'和
'mscorlib,版本=4.0.0.0,区域性=中性,
PublicKeyToken=b77a5c561934e089'控制台AP3.DNX 4.5.1
更新2:可以更换线路
Console.WriteLine("{0}.{1:D4}s", duration.Seconds, duration.Nanos);
到
只要使用Console.WriteLine(duration);
或var str=duration.ToString();
就会产生您描述的错误
更新3:我验证了用于格式化的代码duration.ToString()
调用。似乎代码duration.ToString()
与((对象)duration)的作用完全相同。对于WellKnownTypes
类型(如duration
)
我认为最新的评论很重要。所描述的问题只存在于dnx451(或dnx452或dnx46)中。如果要删除这些行
"dnx451": { },
从“frameworks”
部分project.json
中,程序将仅为DNX Core 5.0编译(Console.WriteLine((object)duration);
"dnx451": { },
<package>
<metadata>
...
<frameworkAssemblies>
<frameworkAssembly assemblyName="System.Runtime" targetFramework="net45" />
</frameworkAssemblies>
</metadata>
...
</package>