小编arc*_*hgl的帖子

CLR在非CLR创建的线程中托管异常处理

问题:

从非托管代码进入CLR的线程中的未处理异常不会触发"正常"未处理异常CLR处理.

在下面的代码CSSimpleObject.GetstringLength()中用C++ 调用

  • "1"在调用线程(非CLR创建的线程)中抛出异常,
  • "2"在新的Thread()(CLR创建的线程)中抛出异常.

在"1"的情况下

  • 永远不会调用CurrentDomain_UnhandledException().
  • 应用程序域和进程将保持加载和运行的,你只会得到一个失败.

在"2"(预期行为)的情况下

  • 调用CurrentDomain_UnhandledException().
  • 这个过程被杀了.

问题:

要做出"正常"行为需要做些什么?

示例代码:

下面的代码基于" 所有互操作和融合样本 "中的Visual Studio 2010" CppHostCLR "代码示例.

RuntimeHost(C++):

PCWSTR pszStaticMethodName = L"GetStringLength";
PCWSTR pszStringArg = L"1";
//PCWSTR pszStringArg = L"2";

hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath,
    pszClassName, pszStaticMethodName, pszStringArg, &dwLengthRet);
if (FAILED(hr))
{
    wprintf(L"Failed to call GetStringLength w/hr 0x%08lx\n", hr);
    goto Cleanup;
}
Run Code Online (Sandbox Code Playgroud)

托管代码(C#):

public class CSSimpleObject
{
    public CSSimpleObject()
    {
    }
    //------8<----------
    public static int GetStringLength(string str)
    {
        AppDomain.CurrentDomain.UnhandledException += new …
Run Code Online (Sandbox Code Playgroud)

.net c++ clr exception-handling clr-hosting

17
推荐指数
1
解决办法
1861
查看次数

标签 统计

.net ×1

c++ ×1

clr ×1

clr-hosting ×1

exception-handling ×1