У меня есть проект C++, содержащий метод неуправляемой класс, используемый для отображения строки в пользовательском интерфейсе:Передача родной функции указатель на метод C#
void MyProject::displayIHM(std::string mystring);
Этот проект компилируется с/CLR, потому что он вызывает еще один сделанный с помощью C# /. NET 4.0. Цель проекта .NET - сделать тяжелые задачи вычисления. Во время вычисления мы хотим получить от него некоторую информацию в пользовательском интерфейсе.
Моя идея состояла в том, чтобы создать два новых метода в C++ - кли проект:
void MyProject::displayFromDotNet(String^ mystring)
{
displayIHM(ToStdString(mystring));
}
string ToStdString (String^s)
{
const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
string os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
return os;
}
До сих пор все в порядке, но теперь трудная часть: как обеспечить displayFromDotNet для проекта .NET. Моя идея состояла в том, чтобы обеспечить указатель на функцию в конструктор класса .NET, а затем запустить процесс:
void (MyProject::*pointeurFunc)(String^) = &MyProject::displayFromDotNet;
ComputationProject^ kernel = gcnew ComputationProject((this->*pointeurFunc));
kernel->Compute();
Вторая линия не работает. У конструктора ComputationProject есть параметр IntPtr, но я не знаю, могу ли я преобразовать указатель на IntPtr^в C++. Я также сделал несколько попыток с использованием Marshal :: GetDelegateForFunctionPointer, но он не смог скомпилировать.
Я не знаю, что делать, любая помощь будет оценена!
EDIT: yes ComputationProject - мой проект C# /. NET. Ошибка с строкой 2 «не может преобразовать параметр 1 из« перегруженного типа функции »в« System :: IntPtr ».
Описание проблемы может быть понятнее. Я предполагаю, что ComputationProject является классом C#? Когда вы говорите: «Вторая строка не работает», вы имеете в виду, что она генерирует ошибку компиляции или ошибку времени выполнения. Я бы ожидал, что указатель на функции C/C++ будет больше делегатом на C#. Взгляните на http://stackoverflow.com/questions/11425202/is-it-possible-to-call-ac-function-from-c-net и http://stackoverflow.com/questions/6077329/how- do-i-call-ac-function-from-c-sharp и посмотреть, поможет ли это – Dweeberly
Я редактирую свой вопрос. К сожалению, ваши ссылки мне не помогают. Я не могу использовать импорт DLL в моем проекте .NET (ComputationProject), так как мне нужно получить метод класса (а не статический метод). Я должен кормить его с помощью конструктора и gcnew, но я не знаю, как это сделать. – NicoGDF
Вам нужно будет обернуть функцию экземпляра C++ в управляемом делетете –