P/Invoke.如何从C#调用具有封送的非托管方法

本文关键字:方法 Invoke 调用 | 更新日期: 2023-09-27 18:23:49

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方法,然后从C#代码将结果传递给DisposeAudioFileList?谢谢

P/Invoke.如何从C#调用具有封送的非托管方法

我一直使用它来生成我的静态外部恶意

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

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

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

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

如何封送C++类

由于名称混乱,您不能。您应该投资学习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.