У меня есть неуправляемая DLL C ++, которая вызывается из приложения C #, я пытаюсь заставить приложение C # перехватывать все исключения, чтобы в случае сбоя DLL из-за неуправляемого исключения пользователь получит наполовину приличное сообщение об ошибке (приложение C # представляет собой веб-сервис, реализующий собственный обработчик http).
У меня проблема в том, что не все типы ловятся. Поэтому, если я создаю следующее и запускаю приложение C #, тогда dll выдает ошибку, и все приложение завершается. Есть идеи?
Это создается в VS2005 и использует .Net framework v2
C ++ - Test.h
#ifndef INC_TEST_H
#define INC_TEST_H
extern "C" __declspec(dllexport) void ProcessBadCall();
#endif
C ++ - Test.cpp
#include <iostream>
#include <vector>
using namespace std;
void ProcessBadCall()
{
vector<int> myValues;
int a = myValues[1];
cout << a << endl;
}
C # - Program.cs
class Program
{
[DllImport("Test.dll", EntryPoint="ProcessBadCall")]
static extern void ProcessBadCall();
static void Main(string[] args)
{
try
{
ProcessBadCall();
}
catch (SEHException ex)
{
Console.WriteLine("SEH Exception: {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception: {0}", ex.Message);
}
}
}
DLL компилируется в конфигурации выпуска со следующими флагами компилятора.
/ O2 / GL / D "WIN32" / D "NDEBUG" / D
"_CRT_SECURE_NO_WARNINGS" / D
"_UNICODE" / D "UNICODE" / D "_WINDLL"
/ ФД / ЭХа / МД / Фо "Релиз \"
/Fd"Release\vc80.pdb "/ W4 / WX / nologo
/ c / Wp64 / Zi / TP / errorReport: приглашение