У меня есть неуправляемая dll C++, которая вызывается из приложения C#, я пытаюсь заставить приложение C# уловить все исключения, чтобы в случае DLL из-за неуправляемого исключения, пользователь получит полупристойное сообщение об ошибке (приложение C# - это веб-сервис, реализующий собственный HTTP-обработчик).C# не ловил необработанные исключения из неуправляемой библиотеки C++
Проблема заключается в том, что не все типы пойманы. Поэтому, если я создам следующее и выполняю приложение 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);
}
}
}
dl l компилируется в соответствии с конфигурацией выпуска со следующими флагами компилятора.
/O2/GL/D "WIN32"/D "NDEBUG"/D "_CRT_SECURE_NO_WARNINGS"/D "_UNICODE"/D "UNICODE"/D "_WINDLL" /FD/EHa/MD/Fo "Release \" /Fd"Release\vc80.pdb»/ W4/WX/NOLOGO /с/Wp64/Zi/TP/errorReport: проворная
Когда dll скомпилирована в режиме отладки, это не приведет к возникновению исключения SEH, но приведет к сбою утверждения. – smerlin
К сожалению, пропустил этот бит, dll скомпилирован в режиме освобождения –
Вы пробовали «catch {Console.WriteLine (« blah »);}«? – Polyfun