AccessViolationException从托管C ++调用本机C ++代码(ASP.NET包装器)

时间:2018-02-07 08:29:57

标签: c++ managed-c++

我有一个ASP.NET Web应用程序,需要访问本机C ++ DLL中的函数。为此,我使用托管C ++ DLL包装了本机C ++代码。但是,从托管代码调用本机函数会生成System.AccessViolationException。我没有本机代码,但它会写入文件系统(日志),这是我的第一个猜测,但根据其他SO答案,AccessViolationException是由内存问题引起的。

代码非常简单,这是未经熟练的版本:

#include <msclr\marshal_cppstd.h>

#define AS_NATIVE_STRING(managed_string) msclr::interop::marshal_as<std::string>(managed_string)
#define AS_MANAGED_STRING(native_string) msclr::interop::marshal_as<String^>(native_string)

ReturnStruct ManagedClass::execute_managed(String ^param1, String ^param2)
{
    auto param1_native = AS_NATIVE_STRING(param1);
    auto param2_native = AS_NATIVE_STRING(param2);

    // here I get the exception:
    auto result = _wrapped_api->execute_native(param1_native, param2_native);

    if (is_error_string(result.first))
        throw gcnew System::Exception(AS_MANAGED_STRING(result.second));

    auto result1 = AS_MANAGED_STRING(result.first);
    auto result2 = AS_MANAGED_STRING(result.second);
    return ReturnStruct(result1, result2);
}

任何可能导致它的提示?我确实看过类似的问题,但似乎没有答案真的适合我的问题。

编辑: 使用HandleProcessCorruptedStateExceptionsAttribute我能够确定AccessViolationException的错误消息:&#34;尝试读取或写入受保护的内存。这通常表明其他内存已损坏。&#34;

1 个答案:

答案 0 :(得分:0)

经过进一步调查,我得出结论,我基本上无法解决这个问题。我自己创建了DLL的模拟版本,以便能够介入并查看类型转换是否正确以及参数是否包含正确的字符串。情况就是这样。这对我没有帮助,但也许其他人可能会用这种方法在他/她的代码中发现问题。

我将联系包装api的作者。