![](/img/trans.png)
[英]project.json warning in vscode when not using project.json
[英]Debugging C# Console Application in VSCode using DNU/DNX and project.json
问题(全部在OSX btw上):
yo aspnet
, dnu restore
, dnu build
, dnx run
dnu build
一个新的C#控制台应用程序-一切都是桃红色的 dnu restore
, dnu build
, dnx run
<-都是dnx run
using Newtonsoft.JSON
添加,然后...实际使用它。 让我们调查一下:
mcs -debug Program.cs
无法编译Program.cs,因为它找不到dnu restore
安装的依赖项,该依赖项位于~/.dnx/packages/...
。 有点道理。 因此,使用mcs
进行编译不是mcs
的方法吗?
其他人则说“使用xbuild
或其他”。 但我不想制作.csproj
文件。 我想使用project.json
和DNU / DNX。 (而且我还没有尝试过)
所以,你可以做什么? 尝试摆弄tasks.json
以使dnu build
工作。
这就是我得到的。
{
"version": "0.1.0",
"command": "dnu",
"options": {
"cwd": "/Users/meh/Development/code/HelloWorld"
},
"showOutput": "silent",
"tasks": [
{
"taskName": "build",
"isBuildCommand": true,
"problemMatcher": "$msCompile"
}
]
}
它虽然不漂亮,但实际上可以完成工作。
现在我无法工作的部分是调试部分。
因此dnu build
在/Users/meh/Development/code/HelloWorld/bin/Debug/dnx451/HelloWorld.dll
这样的目录中创建输出
如果您尝试使其像在launch.json
那样工作,它适用于生成的没有依赖关系的简单Program.cs
文件,那么您将一无所获。 我通过控制台进行了尝试,以查看为什么它不起作用。 所以为什么? 因为mono
找不到必要的依赖项。 为什么? 因为它们不在上述目录中。
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "mono",
"request": "launch",
"program": "/Users/meh/Development/code/HelloWorld/bin/Debug/dnx451/HelloWorld.dll",
"args": [],
"cwd": ".",
"runtimeExecutable": null,
"env": {}
},
{
"name": "Attach",
"type": "mono",
"request": "attach",
"address": "localhost",
"port": 5858
}
]
}
如果使用dnx run
或配置为运行编译程序的任何程序,它当然可以工作。
因此,环顾dnx --help
我已经看到了一个不错的dnx --debug
选项。 如果您在控制台上运行它,则会得到以下不错的输出:
Blah:HelloWorld meh$ dnx --debug run
Process Id: 19228
Waiting for the debugger to attach...
事情是...我不知道调试器正在等待哪个端口。 实际上,似乎mono-sgen
( ps
告诉我PID属于)实际上没有在任何端口上侦听。 我试图通过lsof
检查。
我担心的是dnx --debug
实际上并没有真正起作用,因为我在这里和那里看到的关于github问题的随机评论中提到了一些东西。
而已。 那就是我走了多远。
所以。 有没有人进一步? 有人尝试过吗? 我是一个白痴,试图通过DNX / DNU制作控制台应用程序并使用VSCode对其进行编程和调试吗? 我只是在做完全错误的事情吗?
有没有人?
编辑1 :您必须将其添加到project.json
以获得已编译的DLL文件中的入口,Mono才能运行该程序。
"compilationOptions": {
"emitEntryPoint": true
},
编辑2 :我尝试过的其他事情...
1.查看dnx run
实际作用。
它是做什么的?
45588 s000 U+ 0:02.11 mono /Users/meh/.dnx/runtimes/dnx-mono.1.0.0-rc1-update1/bin/Microsoft.Dnx.Host.Mono.dll run
它从您的项目目录中调用了一个名为Microsoft.Dnx.Host.Mono.dll
文件,该文件用于调用所有文件。
遗憾的是,没有真正的方法将该命令放入launch.json
条目中,以使其a)从正确的目录开始,并且b)从命令中省略.DLL文件名。
这是我可以摆脱launch.json
的最佳launch.json
。
cd '/Users/meh/Development/code/HelloWorld/bin/Debug/dnx451'; 'mono' '--debug' '--debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:61396' '/Users/meh/.dnx/runtimes/dnx-mono.1.0.0-rc1-update1/bin/Microsoft.Dnx.Host.Mono.dll' 'HelloWorld.dll' 'run'
显而易见,运行Microsoft.Dnx.Host.Mono.dll
目录错误,因此不能忽略HelloWorld.dll
参数。
另一件事是。 即使您可以使VSCode生成正确的命令行,它也不起作用。 打开终端并执行以下命令,即可进入调试模式:
cd '/Users/meh/Development/code/HelloWorld/'; 'mono' '--debug' '--debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:61396' '/Users/meh/.dnx/runtimes/dnx-mono.1.0.0-rc1-update1/bin/Microsoft.Dnx.Host.Mono.dll' 'run'
然后,如上所示(当然,端口需要匹配),通过launch.json中的attach config从VSCode附加到调试器,运行程序,但调试器无法launch.json
。猜猜这是因为没有真正调试HelloWorld.dll
。 或dnx build
不输出调试符号。 可能是最后一个。
2.告诉mono在哪里可以细化依赖项。
因此,我在man mono
挖掘,发现可以通过$MONO_PATH
告诉mono在哪里寻找库。
但是制作脚本并拍打~/.dnx/packages
找到的所有路径都不好,因为其中包含了您曾经dnu restored
所有库。 他们的每个版本。
那么,如何仅获取project.json
引用的库? 好吧,我在dnu
周围挖了一下,发现dnu publish
。 它将在bin
内生成一个包含多个内容的output
目录。 其中之一是一个名为packages
的文件夹,其中包含您所有的项目依赖项。
是吗 没有!
因为dnu publish
不会执行dnu publish
操作,所以将创建一个已编译的.DLL文件。 相反,它创建了一个shell脚本,该脚本似乎可以即时编译您的内容。 但是无所谓。 无论如何,我们只是想要DLL。
那么我们有什么。 我们有一个dnu build
,可以为我们提供一个不错的.DLL文件。 我们有一个dnu publish
,可以为我们收集依赖关系。
现在,您可以使用一些外壳魔术,以$MONO_PATH
友好的方式为我们收集路径。
ls -d $PWD/bin/output/approot/packages/*/*/lib/net45 | tr '\n' ':'
问题再次出在launch.json
。 它具有一个名为env : {}
的不错的属性,但是VSCode在生成启动调试器的实际命令时,会将您放入其中的所有内容都放在单引号中。 哪个被解释为文字字符串。 因此,您实际上无法在其中添加类似上面的小命令的内容。 悲伤的长号
顺便说一句。 如果再次打开终端,然后将上述脚本的输出导出到$MONO_PATH
,然后像其他尝试一样手动运行mono
命令,则可以再次尝试将VSCode调试器附加到该命令,但该命令会运行,但是调试器无法连接到它。 再次,我认为这不是调试器符号,还是其他东西。
Flash:HelloWorld meh$ export MONO_PATH=$(ls -d $PWD/bin/output/approot/packages/*/*/lib/net45 | tr '\n' ':')
Flash:HelloWorld meh$ echo $MONO_PATH
/Users/meh/Development/code/HelloWorld/bin/output/approot/packages/Akka/1.0.5/lib/net45:/Users/meh/Development/code/HelloWorld/bin/output/approot/packages/Microsoft.CSharp/4.0.1-beta-23516/lib/net45:/Users/meh/Development/code/HelloWorld/bin/output/approot/packages/Newtonsoft.Json/8.0.1-beta3/lib/net45:/Users/meh/Development/code/HelloWorld/bin/output/approot/packages/System.Collections/4.0.11-beta-23516/lib/net45:/Users/meh/Development/code/HelloWorld/bin/output/approot/packages/System.Linq/4.0.1-beta-23516/lib/net45:/Users/meh/Development/code/HelloWorld/bin/output/approot/packages/System.Threading/4.0.11-beta-23516/lib/net45:
Flash:HelloWorld meh$ cd '/Users/meh/Development/code/HelloWorld/bin/Debug/dnx451'; 'mono' '--debug' '--debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:61396' 'HelloWorld.dll'
Meh
Hello World
{
"blah": "blub"
}
From ConsoleActor: blah blub
From ConsoleActor: blubberblub
Flash:dnx451 meh$
现在的结论。 我全都没主意了。 而且除了使用gulp或其他构建工具(如@richardsonmarkj建议的)外,我认为它不会很快发生。
我也一直试图了解这种情况。 我走过了你的脚步,最终到达了另一个地方。 我没有看到依赖性问题。 当我尝试从VSCode进行调试时,在终端窗口中显示了此信息-
cd '/Users/markr/Projects/ConsoleApplication/bin/Debug/dnxcore50'; 'mono' '--debug' '--debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:58907' 'ConsoleApplication.dll'
Assembly '/Users/markr/Projects/ConsoleApplication/bin/Debug/dnxcore50/ConsoleApplication.dll' doesn't have an entry point.
区别可能是在将Newtonsoft.JSON添加到我的依赖项之后-
"dependencies": {
"Newtonsoft.Json": "8.0.2"
},
在我的project.json文件中我做了dnu restore
编辑:向我的project.json文件添加"compilationOptions": { "emitEntryPoint": true },
确实解决了我的入口点问题。
这是我的代码:-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World");
JArray array = new JArray();
array.Add("Manual text");
array.Add(new DateTime(2000, 5, 23));
JObject o = new JObject();
o["MyArray"] = array;
string json = o.ToString();
Console.WriteLine(json);
Console.Read();
}
}
}
我认为调试器存在与mcs -debug
相同的问题。 通过mono ConsoleApplication.dll
从命令行运行该应用程序
Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.
File name: 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.
File name: 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
将Newtonsoft.Json.dll文件复制到目录中可解决此问题,该应用程序将运行。 同样在那时,调试器似乎可以正常工作,正如我在下面的评论中提到的那样。
我认为我们需要一个构建步骤来收集依赖项并将它们放置在输出目录中。
编辑:我已经验证了这一点。 我将Newtonsoft.Json.dll拉入了根目录,并将task.json更改为-
{
"version": "0.1.0",
"command": "mcs",
"options": {
"cwd": "/Users/markr/Projects/ConsoleApplication"
},
"args": [
"*.cs",
"-debug",
"-r:Newtonsoft.Json.dll"
],
"showOutput": "always",
"tasks": [
{
"taskName": "build",
"suppressTaskName": true,
"isBuildCommand": true,
"problemMatcher": "$msCompile"
}
]
}
指向新的Program.exe时,调试将按预期进行。 这有效地消除了dnu / dnx,这意味着项目管理将变得乏味。 因此,您需要寻找一种用于将非框架依赖项收集到输出/运行时cwd中的方法,以便Mono vm可以找到它们。 似乎Nant或Gulp可能有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.