P / Invoke.Как вызвать неуправляемый метод с маршалингом из C #? - PullRequest
0 голосов
/ 09 февраля 2012

У меня проблема с 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 ]

1 голос
/ 09 февраля 2012

Эта статья о CodeProject объясняет, как бороться с такого рода сортировкой.

Как маршалировать класс C ++

1 голос
/ 09 февраля 2012

К сожалению, нет простого способа вызвать классы в собственном модуле DLL C ++ через P / Invoke.Тем не менее, есть пост в блоге команды разработчиков Visual C ++ с решением , но он сложный.

Есть еще одна ссылка, которая может оказаться полезной: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5df04db1-bbc8-4389-b752-802bc84148fe/

1 голос
/ 09 февраля 2012

Я использую это все время для генерации моей статической внешней малярии

http://clrinterop.codeplex.com/releases/view/14120

0 голосов
/ 09 февраля 2012

Вы не можете, из-за искажения имени.Вы должны инвестировать в изучение C ++ / CLI.Это позволит вам создать промежуточный слой, который обеспечивает правильное маршалинг и не блокируется искажением имен в C ++.

Вот как это может выглядеть в C ++ / CLI (конечно, не проверено):

.h

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.
...