【问题标题】:How to catch an exception in external dll?如何在外部 dll 中捕获异常?
【发布时间】:2023-03-28 23:27:01
【问题描述】:

我想捕获当我尝试使用 Neo4jClient.dll 连接到我的 neo4j 数据库时发生的异常。如果数据库处于脱机状态,我会收到以下错误:“在 mscorlib.dll 中发生了‘System.AggregateException’类型的异常,但未在用户代码中处理。”我的 catch-block 永远不会到达。

这是我的代码:

class Neo4JConnector
{
    private static GraphClient client = null;

    public Neo4JConnector(IniConfigSource configSource)
    {
        if (client == null)
        {
            client = new GraphClient(new Uri(configSource.Configs["Configuration"].Get("Neo4jUrl")));

            try
            {
                client.Connect();
            }
            catch (Exception ex) 
            {
                Console.WriteLine("Cannot connect"); // never reached :(
            }

然后我尝试在这段代码中使用“extern”修饰符:

class Neo4JConnector
{
    private static GraphClient client = null;

    [DllImport("Neo4jClient.dll", EntryPoint="Connect")]
    static extern void Connect();

    public Neo4JConnector(IniConfigSource configSource)
    {
        if (client == null)
        {
            client = new GraphClient(new Uri(configSource.Configs["Configuration"].Get("Neo4jUrl")));

            try
            {
                Connect();
            }
            catch (Exception ex) 
            {
                Console.WriteLine("Cannot connect");
            }
        }

但我得到的只是一个异常,上面写着“[System.EntryPointNotFoundException] = {“无法在 DLL 'Neo4jClient.dll' 中找到名为 'Connect' 的入口点。”:““}”

这是 Neo4jClient.dll 中签名的样子

public virtual void Connect();

我的代码有什么问题?有没有更好的方法来捕获外部异常?请帮忙:(

【问题讨论】:

  • 如果它的签名说是“虚拟的”,那么您可以根据需要覆盖它,包括连接失败的所需 try{}catch{}
  • 能否提供完整的异常堆栈跟踪?

标签: c# dll exception-handling neo4jclient


【解决方案1】:

解决方案是在外部库中抛出异常时,在异常设置菜单中取消选中“抛出此异常类型时中断”。之后我的捕获块到达。无需使用[DllImport]

【讨论】:

    【解决方案2】:

    根据GitHub repo"Neo4jClient.dll" 是一个.NET 程序集。您应该从您的项目中添加对它的引用并使用这些方法。

    这是一个例子:

    using Neo4jClient;
    ...
    var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
    client.Connect();
    

    【讨论】:

    • 最好通过nuget 了解最新变化
    • @ChrisSkardon 是的,他们也提供nuget 包。谢谢提醒。
    • 我当然可以。问题是,如果我启动应用程序但 neo4j 没有运行,Neo4jClient.dll 中会引发异常。但是,我想在我的代码中捕获异常并向用户提供适当的错误消息...
    • @markai 首先,这与您当前的问题完全无关,请编辑它。其次,你总是可以捕捉到 Connect 方法抛出的异常。
    • 这不是无关的。第二个代码 sn-p 是我尝试解决我所描述的问题。不过,已经解决了。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2020-05-08
    • 1970-01-01
    • 2013-05-03
    • 2012-03-16
    相关资源
    最近更新 更多