Converting static link library to dynamic dll

2019-01-16 13:29发布

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 functions defined in the static library (when I press ctrl + space).

As a total newbie I do not know how I can 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 different name.

What to write in header file and .cpp file?

7条回答
手持菜刀,她持情操
2楼-- · 2019-01-16 13:44

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

查看更多
狗以群分
3楼-- · 2019-01-16 13:54

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.

查看更多
疯言疯语
4楼-- · 2019-01-16 13:54

there are two versions of LIB can be generated, the fist is the dynamic lib, (source file + header+ dynamic lib) --> to access the DLL

or static lib=(dynamic lib+DLL) --> (Source file+header) --> to access the DLL.

if you have the Dynamic Lib > there is no way to create the DLL (you cannot get something from nothing), dynamic lib is just an interface,

but if you have the Static Lib then there is no need to DLL to access it is functions.

查看更多
冷血范
5楼-- · 2019-01-16 13:58

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, ...
查看更多
SAY GOODBYE
6楼-- · 2019-01-16 13:59

Take a look at my answer to this question for a possible solution. Almost positive this will work for you...

In short: Enable the "Use Library Dependency Inputs" option in your Linker settings. If set to "true", it will force linking ALL symbols & code declared in every LIB specified as input to the project.

查看更多
Juvenile、少年°
7楼-- · 2019-01-16 14:04

The target dll, i am writing, is a wrapper for popular lzo library. I have created the project by the name LZO.

Here how it looks like in my real application.

LZO.h

    #ifdef LZO_EXPORTS
    #define LZO_API __declspec(dllexport)
    #else
    #define LZO_API __declspec(dllimport)
    #endif

    extern "C" LZO_API void Decompress(char* inp_buff, 
unsigned short* inp_len, char* buffer_decomp,unsigned *output_len);

LZO.cpp

      #include "stdafx.h"
        #include "LZO.h"
        #include "lzo1z.h"
        #include "lzoconf.h"
        #include "lz_decomp.c"

        LZO_API void Decompress(char* inp_buff, unsigned short* inp_len, char* 
    buffer_decomp,unsigned *output_len)
        {
          //Calling from static library
          lzo_decomp (inp_buff,inp_len,buffer_decomp,output_len,NULL); 
        }

And finaly my C# code

//P/Invoke declaration
[DllImport("LZO.dll")]
 private static extern void Decompress(
   byte[] inp_buff,
   int inp_len,
   byte[] buffer_decomp,
   ref int output_len
  );        

//And calling it as below
Decompress(src, src.Length, dst, ref outlen);
// src is byte [] 
// dst is also a byte [] 
// oulen is int

where am i wrog???

查看更多
登录 后发表回答