的P / Invoke。如何使用C#编组调用非托管方法?

时间:2012-02-09 12:48:57

标签: c# interop pinvoke marshalling intptr

我的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 方法,而不是将结果传递给 DisposeAudioFileList < /#> 来自C#代码? 谢谢!

4 个答案:

答案 0 :(得分:1)

我一直用这个来生成我的静态外部malarkey

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

How to Marshal a C++ Class

答案 3 :(得分: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.