Program.cs 是个简单的控制台应用程序,输出“Hello World”
using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }而另一个文件:project.json,它是项目配置文件,并以JSON的格式定义了应用程序的基本信息,比如:version、buildOptions、authors、dependencies、frameworks 等。
{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0-rc2-3002702" } }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } } }上述JSON 格式中,由于 Main 方法作为应用程序的入口(Entry Point),所以需要将 buildOptions 节点下的emitEntryPoint 属性设置为 true。
dependencies 节点代表应用依赖的 packages,默认情况下只添加了 Microsoft.NETCore.App 的依赖。值得注意的是,Microsoft.NETCore.App 是一个引用类型的Nuget Package,它又引用了其他的Nuget Package。这样的好处是避免添加大量的其他package。
frameworks 节点列出了应用程序支持的 frameworks。默认情况下,应用程序只支持.NET Core 1.0,以别名 netcoreapp1.0 表示。netcoreapp1.0 下的 imports 节点 引用旧名称 dnxcore50。这允许我们仍旧可以使用旧名称的 package。
接着,通过dotnet restore 下载所需要的依赖项
通过 project.lock.json,查看具体下载的 package 版本。
为了编译应用程序,使用命令 dotnet build。
最后,使用 dotnet run 运行应用程序。
值得注意的是,在 framework 中也可以添加应用程序对其他 frameworks 的支持,添加字符串net46,表示当前的控制台应用程序构建于.NET Framework 4.6之上:
"frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" }, "net46":{} }遗憾的是,dotnet build 之后,发生了异常。如下所示(注:当前版本是.NET Core RC 2),
可以看到异常信息是 System.Runtime.Loader 不支持.NET Framework 4.6。只是一个很笼统的信息,个人猜测 Runtime Loader 只支持 CoreCLR 的加载,在 Github(https://github.com/dotnet/corefx/issues/8453) 中,也应证了我的观点。暂时的解决方法是将dependencies 节点 移入到frameworks 下的 netcoreapp1.0 中:
{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50", "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0-rc2-3002702" } } }, "net46":{} } }dotnet build 之后,分别生成两个文件夹 net46 和 netcoreapp1.0,使用 ILDasm(见上一小节)工具,打开文件夹可以看到他们之间一个很重要的区别,使用.NET Framework 的应用程序编译之后为生成包含 IL 的 EXE 应用程序并且依赖mscorlib程序集 ,而使用.NET Core 的应用程序编译之后生成包含 IL 的DLL,依赖System.Console 和 System.Runtime 程序集。
最后,通过 dotnet run --framework net46 指定 famework 的版本为.NET Framework 4.6 查看运行结果。
除了 dotnet build 和 dotnet run 外,你还可以通过 CLI 打包(dotnet pack)和 发布(dotnet publish)应用程序。
dotnet pack 创建了一个 NuGet Package:
它是一个后缀名为 nupkg 的 Nuget Package,你可以将它改为.zip,解压查看里面的内容。
dotnet publish 发布一个可用于部署.NET 项目,你可以在 project.json 添加 runtime :
"runtimes" : { "ubuntu.14.04-x64": { }, "win7-x64": { }, "win10-x64": { }, "osx.10.10-x64": { }, "osx.10.11-x64": { } }然后使用 dotnet restore 下载指定的 runtimes。当跨平台发布时,通过参数 -r 指定 runtime,比如 dotnet publish -r ubuntu.14.04-x64,最后将发布之后的文件夹(ubuntu.14.04-x64/publish)拷贝到指定 OS 就可以执行,无需安装 .NET Core 和 .NET Core SDK,只需安装.NET Core 依赖的 Libraries 即可。
小结告别.NET 开发一年多,没想到发生了这么多不可思议的技术,抓紧时间补充一下。我招过人,也求过职,深切体会到国内.NET 的生态环境不给力,希望.NET Core 的出现能为我们指向一条明路,就像森林里一缕阳光,带来希望。
posted @