Необработанное исключение VS2010 при отладке c ++, который вызывает смешанный режим, который вызывает c # dll

Привет и заранее спасибо за ваше время, читая это.

У меня проблема отладки моего решения в VS2010. Чтобы быть более конкретным, вот настройки:

  • все закодировано для Windows 7, 64bit
  • сторонний EXE (c ++) выставляет свой API поверх c #
  • мой плагин (c #) вызывает в dll в смешанном режиме
  • dll в смешанном режиме вызывает нативный c ++
  • native c ++ dll вызывает много производственного кода, уже написанного для других программ (также native c ++)
  • Нативная c ++ dll также вызывает другую dll смешанного режима, которая затем вызывает c # dll
  • все написано и скомпилировано в VS2010

Вот странная вещь:

  • когда я отлаживаю свой управляемый код, все работает нормально; без исключений
  • когда я отлаживаю свой нативный код, я получаю случайные исключения (0xe0434352) только тогда, когда c ++ вызывает в dll смешанного режима (который на самом деле просто является интерфейсом для кода в c # dll)
  • когда появляется окно исключения (первый шанс), я нажимаю пропустить / продолжить, но дальнейшая отладка невозможна; хотя результаты выполнения программы совпадают
  • проблема исчезнет, ​​если я закомментирую вызов кода смешанного режима

Размещение производственного кода немного чувствительно. Исключение является только общим, о котором я упоминал выше. Окно исключений буквально говорит:

  • Исключение (первый шанс) произошло в Revit.exe: 0xe0434352: 0xe0434352.
  • Это Revit MEP 2013

KernelBase.dll! 000007fefd8f9e5d ()
[Untenge angegebene Rahmen sind möglicherweise nicht korrekt und / oder fehlen, keine Symbole geladen für KernelBase.dll] clr.dll! 000007fee65c4e13 ()
clr.dll! 000007fee65c597e ()
000007fe898bad42 ()
000007fe898b65be ()
000007fe898b646b ()
000007fe898b6144 ()
000007fe898b5fa3 ()
000007fe898b5d4b ()
clr.dll! 000007fee644f2ee ()
RevitClient.dll! RvtToMyProg :: getPropMappedValue (std :: basic_string, std :: allocator> & Res = «», int Sel = 0, DigitalModelMapping & DigiModMap = {…}, const CadElem & Elem = {…}, std :: basic_string, std :: allocator> & Prop = «NAME») Zeile 721 + 0x8d байт C ++
RevitClient.dll! RvtToMyProg :: addElementAttributes (int Sel = 0, const CadElem & CadElem = {…}, DigitalModelMapping & DigiModMap = {…}, дескриптор const * EntDesc = 0x000000003ace72b0, Entity * XDataEnt = 0x0000000056ad70a0) Zeile 630 + 0x75 байт C ++
RevitClient.dll! RvtToMyProg :: dataToMyProg (DigitalModelMapping & DigiModMap = {…}, std :: set>>, std :: less>>>, std :: allocator>>>> & Имена классов = 3, дескриптор & ModDsc = {…}, XDataModel & XData = {…}) Zeile 575 + 0x46 байт C ++
000007fe898a7aa3 ()
000007fe898a79eb ()
000007fe898a7837 ()
000007fe898a5aef ()
000007fe898a5624 ()
clr.dll! 000007fee644f2ee ()
RevitAPIUILink.dll! 0000000033c31bfb ()
RevitAPIUILink.dll! 0000000033c326d8 ()
DesktopMFC.dll! 00000000007e1843 ()
000007fe898a471e ()
000007fe898a044f ()
000007fe8989ff7b ()
000007fe8989fc3e ()
000007fe89892e9d ()
000007fe89892d33 ()
000007fe87d0da2a ()
000007fe87d0d81b ()
000007fe89892b1a ()
000007fe87d0d2e6 ()
000007fe87d0ca76 ()
000007fe87d0955a ()
000007fe89892880 ()
000007fe898925c9 ()
000007fe8989f382 ()
000007fe89852427 ()
000007fe87d0d2e6 ()
000007fe87d0ca76 ()
000007fe898439be ()
000007fe87d0d2e6 ()
000007fe87d0ca76 ()
000007fe87d0955a ()
000007fe896da930 ()
000007fe8943dbb8 ()
000007fe8943cbcb ()
000007fe8943c84f ()
000007fe896d3520 ()
000007fe8796a6d8 ()
000007fe8796a261 ()
000007fe873b09ae ()
000007fe873b087c ()
000007fe873b06f5 ()
000007fe873b0507 ()
000007fe873afee7 ()
000007fe873acd2e ()
000007fe873ac383 ()
clr.dll! 000007fee644f2ee ()
user32.dll! 0000000077919bd1 ()
user32.dll! 00000000779198da ()
user32.dll! 00000000779167c2 ()
mfc100u.dll! CWnd :: IsDialogMessageW (tagMSG * lpMsg = 0x0000000000000202) Zeile 198 C ++
mfc100u.dll! CControlBar :: PreTranslateMessage (tagMSG * pMsg = 0x000000900abd6714) Zeile 445 + 0x2c байт C ++
mfc100u.dll! CWnd :: WalkPreTranslateTree (HWND__ * hWndStop = 0x000000000922e8a0, tagMSG * pMsg = 0x0000000000000002) Zeile 3311 + 0x10 байт C ++
mfc100u.dll! AfxInternalPreTranslateMessage (tagMSG * pMsg = 0x0000000140003070) Zeile 233 + 0x15 байт C ++
mfc100u.dll! AfxInternalPumpMessage () Zeile 178 + 0x12 байт C ++
mfc100u.dll! CWinThread :: Run () Zeile 634 C ++
mfc100u.dll! AfxWinMain (HINSTANCE__ * hInstance = 0x0000000000000001, HINSTANCE__ * hPrevInstance = 0x0000000000000000, wchar_t * lpCmdLine = 0x0000000000000000, int nCmdShow = 0 + C ++ C ++ 47 Byte 47
Revit.exe! 00000001400011d6 ()
kernel32.dll! 00000000777f652d ()
ntdll.dll! 0000000077a2c521 ()

  • может быть пример кода:

    c++:
    dostuff()
    {
    //it = std::list::iterator
    std::string = this->MixedMode->GetElementPropertyValue(Sel, it->Name, it->Api);
    }
    
    mixed mode:
    
    std::string RevitBridge::GetElementPropertyValue(int Sel, const std::string &Name, const std::string &ApiName)
    {
    String^ sName = gcnew String(Name.c_str());
    String^ sApiName = gcnew String(ApiName.c_str());
    String^ s = RevitUtils::GetElementPropertyValue(Sel, sName, sApiName);
    return std::string(msclr::interop::marshal_as<std::string>(s));
    }
    
    c#:
    
    public String GetElementPropertyValue(int Sel, String Name, String ApiName)
    {
    if (Sel < 0)
    {
    return "";
    }
    
    if (Name.Equals("_ElementID_"))
    {
    return this.GetElementID(Sel);
    }
    
    BuiltInParameter bip = BuiltInParameter.INVALID;
    try
    {
    bip = (BuiltInParameter)Enum.Parse(typeof(BuiltInParameter), ApiName);
    }
    catch (Exception) {}
    
    if (ApiName.Equals("INVALID") || BuiltInParameter.INVALID == bip)
    {
    return this.GetElemParamValueAsString_ByName(iters[Sel].Current, Name);
    }
    
    return this.GetElemParamValueAsString(iters[Sel].Current, bip);
    }
    

Я был бы рад за любой совет, указывающий мне в правильном направлении.

Спасибо,
Корнель

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]