Sampath579 Ответов: 2

Как вызвать статическую функцию .NET из приложения C++?


Привет
Я работаю над приложением c++ в visual studio 2015 и получил требование добавить проект C# в мое приложение и вызвать эти функции C# из моего проекта c++.

Но есть случай, когда одна конкретная функция .net не вызывается из моего проекта c++. После отладки я понял, что эта функция .net имеет вызов следующим образом:

общественного недействительными DotNetFun()
{
Образец.Открыть();
}

Пример - это класс, а Open-статическая функция-член в проекте .net. Эта функция доступна из сторонней библиотеки dll. У нас нет доступного исходного кода.

почему эта функция (DotNetFun()) не вызывается? Если я удалю образец заявления.Откройте() из этого DotNetFun (), а затем эта функция будет вызвана.

Что я уже пробовал:

IDecoderPtr pIDecode(__uuidof(CDecompresser));
pIDecode->DotNetFun((BSTR)lpzFileName, &vbIsValidFile,&lFileVersion);

2 Ответов

Рейтинг:
1

TheRealSteveJudge

Вы можете посмотреть здесь: Вызов методов C# .NET из неуправляемого кода C/C++ [^]


Рейтинг:
1

OriginalGriff

Функция не соответствует сигнатуре, с которой вы ее вызываете: она объявлена без параметров, и вы передаете три.

Я бы сначала проверил, что вы пытаетесь сделать немного ближе!

Кстати: это не статическая функция .NET - это функция экземпляра.


Sampath579

Код - это просто образец, который я дал. Если сигнатура функции не совпадает, мой код не будет компилироваться первым.

IDecoderPtr pIDecode(__uuidof(CDecompresser));
pIDecode->DotNetFun();

Open-это статическая функция в этой сторонней dll-библиотеке. Пример-это класс в этой библиотеке dll.

Функция, которую я вызываю, то есть DotNetFun (), не является статической функцией. Внутри этой функции есть вызов следующего вида:

общественного недействительными DotNetFun()
{
Образец.Open(); //open-это статическая функция в сторонней библиотеке dll.
}

OriginalGriff

Поэтому не описывайте вещи как "статичные", когда они не являются таковыми, и не давайте нам примеры кода, которые не имеют ничего общего с реальным кодом, который вы используете. Вам не приходило в голову, что вполне вероятно, что именно фактические параметры и то, что вы делаете с ними на одном конце или другом, вызывают вашу проблему? И что мы даже не можем начать помогать вам, пока не узнаем, что на самом деле происходит?

Sampath579

В visual studio у меня есть два проекта (статические библиотеки).
1. Проект C++
2. Dll .Net

из моего проекта на c++

#импорт "D:DotNet\\DecoderAndDecompresser.tlb" named_guids

пустота проверить: создать()
{
IDecoderPtr pIDecode(__uuidof(CDecompresser));
pIDecode->DotNetFun();
}

В проекте .net

пространство имен DecoderAndDecompresser
{
IDecoder открытого интерфейса
{
пустота DotNetFun();
};
публичный класс CDecompresser : IDecoder
{
общественного недействительными DotNetFun()
{
Образец.Open(); // Open-это статическая функция-член в одном из файлов .netdll.
}
}
}


Когда я вызываю DotNetFun() из своего кода c++, управление даже не переходит к этой функции, и приложение завершается. Если я удалю этот вызов, то есть образец.Open() тогда нет никаких проблем.

Надеюсь, это поможет вам понять мой сценарий.