Click here to Skip to main content
Click here to Skip to main content

Creating and Calling C Function DLL from .NET

By , 15 Sep 2004
 

Introduction

I will give an example of how to create a C DLL function and call it from VB.NET. It is simple but there are some tasks that you have to do.

First, create a C DLL Project. Use VC++ 6, from the File new project wizard, choose Win32 Dynamic-Link Library, click OK. Select an Empty DLL Project, because we just want to create a simple DLL. Click next.

Now add some files. From File new, select Files tab, select C++ Source File, name it for example Simple.c. Repeat the last step by creating Simple.def file.

Double click Simple.c and add the following code:

#include <WINDOWS.H>

      LPCSTR DisplayStringByVal(LPCSTR pszString)
      {
          return "Hallo apa kabar ";
      }

    void ReturnInParam(int* pnStan, char** pMsg)
    {
        long *buffer;
        char text[] = "Hallo ";
        char name[sizeof(*pMsg)];
         strcpy(name, *pMsg);
        *pnStan = *pnStan + 5;

        buffer = (long *)calloc(sizeof(text)+sizeof(*pMsg), sizeof( char ) );
        *pMsg = (char *)buffer;

        // do not free the buffer, because it will be used by the caller
        // free( buffer );
         strcpy(*pMsg, text);
         strcat(*pMsg, name);
      }

The first function simply returns the string "Hallo apa kabar" without processing anything. The second function adds "Hello" in front of the pMsg parameter and adds the pnStan parameter with 5. For example, if you call the second function from VB.NET code as below:

    <DllImport("E:\Temp\simple.dll", CallingConvention:="CallingConvention.Cdecl)"> _
    Private Shared Sub ReturnInParam(ByRef Stan As Integer, _
        ByRef Message As String)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        Dim Num As Integer = 8
        Dim Message As String = "Harun"
        ReturnInParam(Num, Message)
        MessageBox.Show(Message)
    End Sub

After you call the function, the Num variable value is 13, and the message box will prompt Hello Harun.

Here is an explanation of some important things in the code. Let's see the function declaration in C:

void ReturnInParam(int* pnStan, char** pMsg)

The code...

int* pnStan

... indicates that you want to pass the parameter by reference, not by value. You can see this in the VB code:

Private Shared Sub ReturnInParam(ByRef Stan As Integer, _ ... 

The code...

char** pMsg 

... also indicates the same thing. The reason I put two asterisks (*) here is because .NET translates char* with a single quote as string and passes the parameter by value. So, if I want to pass the string by reference (or as a pointer), then I have to put another asterisk.

The rest of the C code is about adding 5 to pnStan and "Hello" at the beginning of pMsg. You must know C to understand the code.

Before you compile the C file, there is a final step that needs to be done:
Define the library and function in the Simple.def file as follows:

LIBRARY Simple
      DESCRIPTION 'Sample C DLL for use with .NET'
      EXPORTS
        DisplayStringByVal
        ReturnInParam

This tells VB where to locate the function Entry Point. If you don't provide this declaration, then you will get a message just like this:

An unhandled exception of type 'System.EntryPointNotFoundException' 
    occurred in Call_C_dll.exe

Additional information: Unable to find an entry point named ReturnInParam 
    in DLL E:\Temp\simple.dll.

Well, that's all, simple isn't it?

License

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

About the Author

harunmip
Web Developer
Indonesia Indonesia
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generali get an error when i use the code in visual studio 2008membermlov838 Jan '11 - 7:27 
Generalcall functions in a dll made with VB 2005 in a VB 2003 projectmembermurad198522 Nov '08 - 22:46 
QuestionHow to call this functionmemberMuneer Safi18 Nov '08 - 2:35 
Questionmemory leak???memberpradeeppatel5 Aug '07 - 19:54 
Generalcall C code from C#memberBandoleiro11 Dec '06 - 0:35 
QuestionCalling From ServicedComponent?memberPyrinoc21 Nov '06 - 12:32 
AnswerRe: Calling From ServicedComponent?memberEric Engler4 Jan '07 - 11:22 
GeneralExtra Line needed in VB.NET codememberbetwulf25 Jul '06 - 11:21 
Questiondll from c?memberjason_limwk2 Mar '06 - 22:10 
AnswerRe: dll from c?memberLunaSoft Inc.15 Aug '06 - 23:55 
GeneralThanks for thatmemberRocketDude10 Dec '05 - 5:42 
GeneralDll Problemmembersrikar129 Aug '05 - 0:11 

url : = http://www.dotnet247.com/247reference/reply.aspx?s=607
 
(Type your message here)
 
Hi All,
 
I am calling a COM DLL which is written in VC++ from VB.Net application.
 
The thing is the method which handles operation with integer works fine.
The problem is with string.
 
I pass a parameter as string which remains empty after calling a method in dll.
 
This is that code from vb.net
iRetval = g_Contract.ContgetTotalNum()//Works fine.
Dim strBuffer as String
strBuffer = New string(" ",255)
g_Contract.CONTGetContractNumbers(2,strBuffer,Len(strBuffer)//strBuffer remains empty
cbo.Items.Add(strBuffer)//trying to populate the combo box.
 

The code in VC++ is
 
STDMETHODIMP CCOMDISBOBJECT::CONTGetContractNumbers(short sContract ,LPSTR lpzBuffer, long Buffersize)
.....
 
The ILDASM generated code is
CONTGetContractNumbers([in] int16 sContract,[in] string marshal(lpstr) lpzBuffer,[in] int32 Buffersize)
..............
 
I tried using stringbuilder also.I do not know if I have used it correctly,but it does not work.
I have also tried to create my own wrapper class.
But I am getting an error like 'Unable to find the entry point'
 
Please help me to get rid out this bug.
Thanks in advance.
 
bye.
gokul
--------------------------------
From: gokul narasimhan
 
hi
Generalnot rightsussAnonymous14 Sep '04 - 8:56 
GeneralCome onmembernorm.net8 Sep '04 - 0:19 
GeneralRe: Come onmemberhelitb8 Sep '04 - 0:42 
GeneralRe: Come onmembernorm.net8 Sep '04 - 0:50 

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

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130516.1 | Last Updated 16 Sep 2004
Article Copyright 2004 by harunmip
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid