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; 

那么,问题是如何调用CreateAudioFileList 方法并将结果传递给DisposeAudioFileListC# 代码?谢谢!

4

4 回答 4

1

我一直使用它来生成我的静态 extern malarkey

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

于 2012-02-09T12:50:52.460 回答
1

不幸的是,没有简单的方法可以通过 P/Invoke 调用本机 C++ DLL 模块中的类。然而,有一个解决方案的 Visual C++ 团队博客帖子,但它很复杂。

还有一个您可能会觉得有用的链接: http: //social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5df04db1-bbc8-4389-b752-802bc84148fe/

于 2012-02-09T13:01:46.107 回答
1

CodeProject 上的这篇文章解释了如何处理这种编组。

如何编组 C++ 类

于 2012-02-09T14:29:08.893 回答
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 回答