0

P/Invoke に問題があります。C# コードから .dll (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; 

問題は、メソッドを呼び出して、C# コードからCreateAudioFileList 結果を渡す方法です。DisposeAudioFileListありがとう!

4

4 に答える 4

1

残念ながら、P/Invoke を介してネイティブ C++ DLL モジュール内のクラスを呼び出す簡単な方法はありません。Visual C++ チームのブログに解決策が掲載されていますが、複雑です。

役立つリンクがもう 1 つあります。

于 2012-02-09T13:01:46.107 に答える
1

CodeProject に関するこの記事では、この種のマーシャリングに対処する方法について説明しています。

C++ クラスをマーシャリングする方法

于 2012-02-09T14:29:08.893 に答える
1

私はこれを常に使用して、静的な extern malarkey を生成します

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

于 2012-02-09T12:50:52.460 に答える
0

名前のマングリングのため、できません。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.
于 2012-02-09T12:52:44.973 に答える