alex.mironov
alex.mironov

Reputation: 2942

P/Invoke. How to call unmanaged method with marshalling from C#?

I've got a problem with P/Invoke. I'm calling .dll (implemented on c++) from c# code. There is a class, that contains the next methods:

virtual AudioFileList *API  CreateAudioFileList ()=0;
virtual bool API  DisposeAudioFileList (AudioFileList *iAudioFileList)=0;

AudioFileList class looks like:

virtual bool API  GetFile (long index, std::string *oPath, AudioFileInfo *fileInfo)=0;
virtual long API  GetNumberFiles ()=0; 

So, the question is how can I call CreateAudioFileList method and than pass the result to DisposeAudioFileList from C# code? Thanks!

Upvotes: 0

Views: 1397

Answers (4)

Nanhydrin
Nanhydrin

Reputation: 4472

This article on CodeProject explains how to deal with this sort of marshalling.

How to Marshal a C++ Class

Upvotes: 1

Zenexer
Zenexer

Reputation: 19613

You can't, due to name mangling. You should invest in learning C++/CLI. This will allow you to create an intermediary layer that provides proper marshaling and isn't inhibited by name mangling in C++.

Here's what it might look like in C++/CLI (untested, of course):

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

Upvotes: 0

Igor Korkhov
Igor Korkhov

Reputation: 8558

Unfortunately, there is no easy way to call the classes in a native C++ DLL module through P/Invoke. Yet there's Visual C++ Team Blog post with a solution, but it is complicated.

There's one more link you might find useful: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5df04db1-bbc8-4389-b752-802bc84148fe/

Upvotes: 1

Mike Miller
Mike Miller

Reputation: 16575

I use this all the time to generate my static extern malarkey

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

Upvotes: 1

Related Questions