2

我创建了一个具有Invoke函数的小型 C# 库原型。

public class TestClass
{
    public async Task<object> Invoke(dynamic input)
    {
        Dictionary<Type, IReport> reports = new Dictionary<Type, IReport>
        {
            {typeof (LevelOne), new LevelOneReport()},
            {typeof (LevelTwo), new LevelTwoReport()}
        };

        ILevel toTestLevel1 = new LevelOne(1);
        ILevel toTestLevel2 = new LevelTwo(2);

        IReport report = reports[toTestLevel2.GetType()];
        return report.Generate(toTestLevel2);
    }
}

该函数的结果是一个新对象,其中包含一个int。我已经在我的 node/electron/edge.js 应用程序中确认数据已成功从 C# dll 传递到我的应用程序。(即 C# 代码和 JavaScript 可以像我期望的那样协同工作。)

由于这是一个更复杂系统的原型,我希望能够将 Visual Studio 调试器附加到节点(或电子?)进程,让它加载 C# dll 的调试符号文件并允许我逐步完成我的 C# dll 根据 Edge.js 文档(请参阅此处的 github 页面)。我已将 C# dll 和 .pdb 文件复制到电子应用程序目录。

因此,我在 Visual Studio 的 C# 类中设置了一个断点,然后将调试器附加到“托管”node.exe 进程。我注意到的第一件事是有两个 node.exe 进程正在运行,这两个进程都没有文档中提到的“托管”描述。

我尝试先附加到一个,然后附加到另一个,但在我的 edge.js 调用 C# dll 函数后无法命中断点。我检查了 Debug->Windows->Modules 并看到实际上没有加载任何模块。沮丧的是,我将调试器附加到电子进程(具有“托管”描述),我的 C# dll 突然出现,并在 Debug->Windows->Modules 页面中加载了符号!唉,我的断点仍然没有被击中。

有谁知道是否有办法让 Visual Studio 中的调试器实际附加到节点/电子应用程序并允许在关联的 C# dll 中进行详细调试?

4

1 回答 1

3

好的,我想通了。还有三个 electron.exe 进程也在运行。我在 Visual Studio 中保持 Debug->Windows->Modules 查看器打开,然后运行我的电子/边缘/节点应用程序。使用那里的调试工具,我在对我的 C# dll 的函数调用之前放置了一个断点并运行它。它停在断点上。然后我将调试器附加到第一个 electron.exe 进程并在 C# 类中设置断点。然后,我跳过了对 C# 库的调用。我为每个 electron.exe 进程重复了这个过程。具有“托管”描述的 electron.exe 进程有效,我能够在 C# dll 中命中断点并逐步执行代码!每次您从电子应用程序逐步调用 C# 代码时,我都可以看到它在模块查看器的 Visual Studio 中加载了我的调试符号。

编辑通过进一步的使用和测试,直到在javascript中调用electron-edge require函数才出现“托管”电子进程。因此,如果您没有看到“托管”电子流程,请确保您的断点设置在此调用之后的某个位置。

于 2016-04-30T21:57:56.960 回答