views:

339

answers:

4

I have .lib file with its header (.h) file. This file have a few functions that need to be used in C# application.

After googling i found that i need to create a dynamic dll from this static library and call this dynamic dll from C# code using interop.

  1. I have created a win32 project and selected type dll.
  2. Included header file and added .lib to additional dependencies.

    I am able to see the fucntions defined in the static library (when i press ctrl + space).

As a totaly newbie i do not know how can i export the function, which is, in .lib with following signature

void testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)

I want same signature in my dynamic dll with a diffrent name.

what to write in header file and .cpp file?

+2  A: 

Create new Dll project using Visual Studio Application Wizard, and check "Exports Symbols" in one of the Wizard steps. It creates sample Dll which exports class, function and variable. You can learn from this sample, how to do this. Generally, every exported function is declared as __declspec(dllexport). In a client project it is declared as __declspec(dllimport). Dll code uses the constant which is defiled as __declspec(dllexport) inside of Dll project, and __declspec(dllimport) in any other place.

Alex Farber
+1  A: 

If you can recompile your lib, just add __declspec(dllexport) to the signatures of all of the functions you want to be exported.

void __declspec(dllexport) testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)

If you can't do that, then you can export them by writing a .def file instead. Using def files you can even change the name of a function as it is exported. http://msdn.microsoft.com/en-us/library/28d6s79h.aspx

---- contents of mylib.def ----

LIBRARY

EXPORTS
   testfun
   newname=testfun2

Then when you link the dll, include mylib.def

link /dll /machine:x86 /def:mylib.def  mylib.lib

Edit2:

note that pinvoke assumes that the functions you import will have _stdcall calling convention unless you say otherwise. So you might need to do this as well, in your C# code.

[DllImport("mylib.dll", CallingConvention=CallingConvention.Cdecl)]

Or, you could change your C++ code to be __stdcall

void __declspec(dllexport) __stdcall testfun( char* inp_buff, ...
John Knoeller
I have created the dll. but when i call it from C#, it said"Unable to find an entry point named 'testfun2' in DLL 'demo.dll'"When i see list of exported functions using DLL export ViewerIt shows the function name as "?testfun2@@YAXPADPAG0PAI@Z"What would be the problem??
Manjoor
@Manjoor: it might be. did you use a def file or _declspec? If you used _declspec, then you probably just need to fix your C# dllImport statements. It would be helpful to see some code.
John Knoeller
I have added the original code. please have a look
Manjoor
+1  A: 

This is what you can do

  1. Add the following code to you .H file. rename "MYPROJECT" to your project name

    #ifdef MYPROJECT_EXPORTS
    #define MYPROJECT_API __declspec(dllexport)
    #else
    #define MYPROJECT_API _declspec(dllimport)
    #endif
    
  2. Go to Properties->C++->Preprocessor and Add the defenition - MYPROJECT_EXPORTS

  3. Add MYPROJECT_API to all the functions you want the dll to expose eg:

    MYPROJECT_API void Test();
    
  4. Go to Project properties General -> Configuration Type change it to Dynamic Dll

You are done

SysAdmin
I have done it as you guys told me to do. dll created. but i am not able to call it from my c# application. see the comment above posted by me.
Manjoor
Hi..the function name you see is wierd because of c++ name manglingtry putting : extern "C" in front of your function and recompile
SysAdmin
as you said i have added extern "C" before function in my header file. but no luck (See the code below)
Manjoor
A: 
Manjoor
there is a spelling error "Decoompress" in .H and "Decompress" is .Cpp
SysAdmin
I have corrected it (see edited code) but the problem is still there.
Manjoor
@Manjoor: I appened some things to try to my original answer
John Knoeller
Thanks for the help. Everything was ok just cleaned and rebuiled the project. It was a c++ name mangling problem.
Manjoor