c# - 如何处理托管 C++ (/CLR) 中 #using 语句中的错误

标签 c# c++ .net interop managed-c++

我有一个托管 C++ 项目(使用/CLR 编译),它通过 #using 语句引用 .NET dll,如下所示:

#using <mydotnet.dll>

dll 的存在是在编译时测试的,也是在运行时测试的。 如果在运行时未找到 dll,则会抛出未处理的异常:

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集 'mydotnet,Version=1.0.0.0,Culture=neutral,PublicKeyToken=n ull' 或其依赖项之一。该系统找不到指定的文件。 在主要(Int32 argc,SByte** argv) 在 _mainCRTStartup()

如何捕捉这个异常?它似乎在实际代码之前运行,这是有道理的,但我找不到另一种优雅地结束程序的方法。

编辑: 我将我的代码缩减为这样,但未能捕捉到任何异常:

#using <mydotnet.dll>

int main(int argc, char* argv[])
{
    try
    {
    }
    catch (System::IO::FileNotFoundException^ ex)
    {
    }
    catch (System::Exception ^ex)
    {
    }
    return 0;
}

谢谢, 罗伊。

最佳答案

据我所知,CLR DLL 是使用 JIT 加载的,因此只有在第一次使用 DLL 中的代码时才会加载它,这是抛出异常的地方。尝试在第一次使用 DLL 时放置一个 try catch block ,这应该会捕获错误。

#using <mydotnet.dll>

...

try{
    // use DLL
} catch (Exception e) {
    // Handle file not found here
}

关于c# - 如何处理托管 C++ (/CLR) 中 #using 语句中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47155172/

相关文章:

c++ - 替换弃用的 QtSignalMapper 类以在 Qt5 中转发信号

c++ - 处理 argc 等于 0

C#异步LCD写入

c# - 如何在 C# 中将 HTML 设置为剪贴板?

c# - 在 Azure Functions 中,如何在输出绑定(bind)中使用路由参数

c# - 如何添加xsi :type attribute to an XML element

c# - 将一张表与自身相乘并得到一个字段是什么意思?

c# - 如何根据 EF 子表中的列对项目进行排序

c++ - 智能指针无法释放内存

.net - 如何处理在较新版本的 .NET(3.5 以上)中数据绑定(bind)期间发生的异常?