P/Invoke. Как вызвать неуправляемый метод с маршалингом из C#?
У меня проблема с P/Invoke. Я звоню.dll (реализовано на C++) из кода C#. Есть класс, который содержит следующие методы:
virtual AudioFileList *API CreateAudioFileList ()=0;
virtual bool API DisposeAudioFileList (AudioFileList *iAudioFileList)=0;
AudioFileList
класс выглядит так:
virtual bool API GetFile (long index, std::string *oPath, AudioFileInfo *fileInfo)=0;
virtual long API GetNumberFiles ()=0;
Итак, вопрос в том, как я могу позвонить CreateAudioFileList
метод, а затем передать результат DisposeAudioFileList
из кода C#? Спасибо!
4 ответа
Вы не можете, из-за искажения имени. Вы должны инвестировать в изучение C++/CLI. Это позволит вам создать промежуточный слой, который обеспечивает правильное маршалинг и не блокируется искажением имен в C++.
Вот как это может выглядеть в C++/CLI (конечно, не проверено):
.час
public ref class ManagedAudioFileList
{
private:
const AudioFileList* Native;
// Replace AudioFileListManager with the class containing
// the CreateAudioFileList and DisposeAudioFileList methods.
const AudioFileListManager* Manager;
public:
ManagedAudioFileList(void);
!ManagedAudioFileList(void);
~ManagedAudioFileList(void);
// Insert various methods exposed by AudioFileList here.
};
.cpp
ManagedAudioFileList::ManagedAudioFileList(void)
{
// Replace AudioFileListManager with the class containing the
// CreateAudioFileList and DisposeAudioFileList methods.
Manager = new AudioFileListManager();
Native = Manager->CreateAudioFileList();
}
~ManagedAudioFileList::ManagedAudioFileList()
{
Manager->DisposeAudioFileList(Native);
delete Manager;
}
!ManagedAudioFileList::ManagedAudioFileList()
{
}
// Wrap various methods exposed by AudioFileList.
Я использую это все время, чтобы генерировать мою статическую внешнюю маляру
Эта статья о CodeProject объясняет, как бороться с такого рода сортировкой.
К сожалению, нет простого способа вызвать классы в собственном модуле DLL C++ через P / Invoke. Тем не менее, есть пост в блоге команды разработчиков Visual C++ с решением, но оно сложное.
Есть еще одна ссылка, которая может оказаться полезной: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5df04db1-bbc8-4389-b752-802bc84148fe/