Click here to Skip to main content
15,868,016 members
Articles / Programming Languages / C#
Article

Dynamic Invoke C++ DLL function in C#

Rate me:
Please Sign up or sign in to vote.
4.61/5 (31 votes)
26 Jun 2008CPOL2 min read 181.1K   94   16
This article introduces why I use dynamic invoke C++ DLL function in C# and how to call it.

Introduction

This article introduces why I use dynamic invoke C++ DLL function in C# and how to call it.

Why I Use Dynamic Invoke Instead of Static Invoke?

Sometimes when I want to write and call some unmanaged function (C++ DLL function), I do the following:

In the *.cpp file...

C++
int __declspec(dllexport) a(int b)
{
      return b;
}

... compile the *.cpp file to a *.dll file and in the C# file:

C#
class Program
{
   [DllImport(@"c:\a.dll")]
   private static extern int a(int b);
   static void Main(string[] args)
   {
       Console.WriteLine(a(3));
   }
}

In this method, you see that I have to declare a static DLL filename, and when I compile to an excutable file (*.exe), I cannot change the DLL filename.

The second case is, I want to write some C++ DLL function for an ASP.NET/IIS (Internet Information Services) Web site. If I static invoke unmanaged, when I want to update the DLL file, I stop the Web site in IIS and replace the old file with the new file, but .. IIS still keeps the old DLL file. It does not release the file, and I have to stop the entire Web site, all services running in IIS for replacing the file.

So, I want to dynamically invoke an unmanaged file. I can load, invoke and free unmanaged DLL function initiatively.

How to Dynamic Invoke Unmanaged DLL Function?

The first way is by referring to dynamicinvokedll.aspx.

The second way that I want to introduce is how to use the WindowAPI function. We use three functions in kernel32.dll (this is a kernel DLL file and appears in [WindowRoot]\System32) LoadLibrary, GetProcess, and FreeLibrary. You can find the C++ declare type functions on MSDN (msdn.com). I only show the declare in C#:

C#
class Program
{
        [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
        static extern int LoadLibrary(
            [MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

        [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
        static extern IntPtr GetProcAddress( int hModule,
            [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

                [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
        static extern bool FreeLibrary(int hModule);
}

The LoadLibrary function loads an unmanaged file, the GetProcAddress function gets the function pointer of an unmanaged file and the FreeLibrary function frees the unmanaged file. Now I can get the function pointer in a.dll very easily:

C#
int hModule = LoadLibrary(@"c:\a.dll");
if (hModule == 0) return false;
IntPtr intPtr = GetProcAddress(hModule, "a");

And when I want to free the a.dll file, I can call:

C#
FreeLibrary(hModule);

But C# doesn’t suport C++ function pointer, so we cannot invoke a C++ function pointer here. C# only has Delegate objects and we have to convert the function pointer to Delegate by Marshal.GetDelegateForFunctionPointer. It is declared in System.Runtime.InteropServices as follows:

C#
public static Delegate GetDelegateForFunctionPointer (
      IntPtr ptr,
      Type t
)

(You can find more support for this function in MSDN.)

We first declare the Delegate for a function:

C#
delegate int A(int b);

And get the delegate object as follows:

A a = (A)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(A));

Now we can invoke a function as follows:

C#
static void Main(string[] args)
{
    Console.WriteLine(a(3));
}

Hope you found this article helpful.

History

  • 26th June, 2008: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Engineer NaisCorp - Socbay.com
Vietnam Vietnam
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionWhat if I need to marshal parameters and return value? Pin
Member 789751523-Sep-13 7:14
Member 789751523-Sep-13 7:14 
GeneralThis helps me a lot!!!! Pin
Kydz_Leo19-May-12 5:01
Kydz_Leo19-May-12 5:01 
QuestionIt's very good Pin
Andrewpeter22-Mar-12 21:47
Andrewpeter22-Mar-12 21:47 
GeneralMy vote of 5 Pin
Andrewpeter22-Mar-12 21:46
Andrewpeter22-Mar-12 21:46 
GeneralMy vote of 5 Pin
cmma8624-Feb-12 4:48
cmma8624-Feb-12 4:48 
GeneralMy vote of 5 Pin
Morries13-Dec-11 15:38
Morries13-Dec-11 15:38 
QuestionPInvoke function unbalanced the stack Pin
Silaghi20-Nov-11 1:29
Silaghi20-Nov-11 1:29 
GeneralMy vote of 5 Pin
Xanblax11-Oct-11 6:01
Xanblax11-Oct-11 6:01 
GeneralMy vote of 4 Pin
JimmyGong24-May-11 16:00
JimmyGong24-May-11 16:00 
GeneralMy vote of 5 Pin
Jangjeet Singh25-Apr-11 4:26
Jangjeet Singh25-Apr-11 4:26 
GeneralMy vote of 5 Pin
LeKoosy31-Mar-11 3:27
LeKoosy31-Mar-11 3:27 
GeneralI have a problem Pin
henry369521-Nov-10 0:30
henry369521-Nov-10 0:30 
GeneralRe: I have a problem Pin
Ali Fakoor1-Oct-11 22:16
Ali Fakoor1-Oct-11 22:16 
GeneralRe: I have a problem Pin
purgatory28-May-12 21:40
professionalpurgatory28-May-12 21:40 
GeneralA note about FreeLibrary() Pin
maeloc26-Jun-08 21:26
maeloc26-Jun-08 21:26 
GeneralRe: A note about FreeLibrary() PinPopular
twaindev1-Jul-08 5:18
twaindev1-Jul-08 5:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.