Проблема в использовании .net dll из c ++ dll через слой c ++ / cli - PullRequest
0 голосов
/ 04 марта 2011

У меня есть c ++ dll, который в определенный момент должен делегировать задачу dll, написанному на .Net. Для этого я создал статическую библиотеку c ++ / cli, которая использует / использует .net dll для достижения некоторой ЗАДАЧИ. Затем я статически связываю статическую библиотеку c ++ / cli с c ++ dll. Это выглядит примерно так.

        cli.aTask()         netdll.aTask()
c++ dll ----------> c++/cli ----------------> .net dll
    < static link  >    <normal assembly inclusion> 

Теперь соединение b / w c ++ dll и c ++ / cli в порядке. я могу сделать что-нибудь, используя библиотеку .net на уровне c ++ / cli, а затем вызвать это из c ++ dll. но когда я создаю объект класса из .net dll или обращаюсь к статическому методу класса .net dll, я получаю исключение в c ++ dll (на самом деле происходит сбой c ++ dll, никаких исключений). ниже сообщение, которое я получил.

foo.exe is using c++dll
Unhandled exception at 0x7c812aeb in "foo.exe": OxE0434f4d: 0xe0434f4d.

c ++ dll-код, вызывающий метод cli:

CLILibrary::CCLILib lib;
lib.GetUsersInput();

cli-код вызова .net dll:

DotNetLibrary::DotNetClass::aMethod();   // static method`

.net код класса dll:

namespace DotNetLibrary
{
    public class DotNetClass
    {
        public DotNetClass(){}

       public static void aMethod(){}
    }
}

Теперь, если я не использую DotNetLibrary::DotNetClass в c ++ / cli lib, исключение прекращается.

Пожалуйста, помогите. Моя цель - вызвать .net lib из c ++ dll, если есть лучший способ, то это тоже будет хорошо. заранее спасибо.

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Необработанное исключение в 0x7c812aeb в "foo.exe": OxE0434f4d: 0xe0434f4d

0xe0434f4d - код исключения для управляемого исключения. Управляемый код, который вы написали, является бомбардировкой, нигде нет обработчика, который ловит это исключение. Это kaboom без приличной диагностики, если вы не запускаете отладчик в управляемом режиме.

Вам нужно будет использовать ключевые слова try / catch в коде C ++ / CLI, чтобы перехватить System :: Exception, сгенерировать диагностику из значения ToString () объекта перехваченного исключения и передать какой-то статус «он мертв, Джим» вернитесь к исходному коду. Не пытайтесь продолжать использовать управляемый код после этого, он мертв с непредсказуемым состоянием.

1 голос
/ 04 марта 2011

Как уже упоминалось, вам нужно перехватить (управляемое) исключение либо в вашей .Net, либо в вашем модуле C ++ / CLI. Что я обычно делаю в своих оболочках C ++ / CLI .Net, так это перехватываю управляемые исключения и перебрасываю их как стандартные с ++. Что-то вроде

try {
   // ... managed call
}
catch (System::Exception^ e)
{
    throw std::exception(ConvertString(e->Message));
}

(где ConvertString - функция, которая преобразует управляемую строку в char * или std :: string). Таким образом, вам все равно придется перехватывать исключение в вашем родном коде, но вы не потеряете информацию об ошибке источника (ну, не совсем так, поскольку стек вызовов из исходного кода, который сгенерировал исключение, и другая информация будут потеряны, но вы также можете сохранить это, если хотите).

0 голосов
/ 04 марта 2011

Скомпилируйте foo.exe как консольное приложение и запустите без отладчика.Когда появится исключение, .NET напечатает его имя и дополнительную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...