簡體   English   中英

AccessViolationException從托管C ++調用本機C ++代碼(ASP.NET的包裝器)

[英]AccessViolationException calling native C++ code from managed C++ (wrapper for ASP.NET)

我有一個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的錯誤消息:“試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。”

經過進一步調查,我得出的結論是,我基本上無法解決這個問題。 我自己創建了DLL的模擬版本,以便能夠介入並查看類型轉換是否正確以及參數是否包含正確的字符串。 就是這種情況。 這並不能真正幫到我,但是也許其他人可能會用這種方法在他/她的代碼中發現問題。

我將只聯系包裝好的api的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM