none
DllImport與C++的class RRS feed

  • 問題

  • 請教一下,當C#想呼叫VC++6所寫的native dll時,我查到可以用P/Invoke,也就是[DllImport]來寫。

    但是我發現,這種做法好像只能呼叫c++中的純function??
    假設今天該dll中有A、B兩個Class,每個類別又有各自的許多Method,那又該如何用c#來new出該class並呼叫其method呢?

    另外,DllImport的EntryPoint一般來說應該怎麼設定呢?

    ps.條件是在不取得dll原始檔的情況下。但是知道有哪些class和method,及其傳入與傳出的資料型態

    2006年10月13日 下午 06:36

解答

所有回覆

  • HI,

    使用DllImport只能呼叫由C語言函數做成的DLL, 無法呼叫C++類別中的Method, 但是您可以為C++類別製作一個C函數的介面, 再給C#程式呼叫.

    您可以使用DLL EXPORT Viewer工具檢視DLL中公開給外界使用的函數, 下載網址:

    http://www.nirsoft.net/utils/dll_export_viewer.html

    tihs

    2006年10月14日 上午 12:45
  • 請問這所謂為C++類別製作個C library的介面,可以舉個例子嗎?

    麻煩了!

    2006年10月17日 上午 07:28
  • 我也想麻煩tihs舉個例子,謝謝。

    另外,如果用com,又該是怎樣的流程呢?(c# call c++ dll)

    2006年10月17日 上午 09:26
  • HI,

    假設有一個C++類別:

    #ifndef __CPPAPI_H__
    #define __CPPAPI_H__

    typedef int BOOL;

    class Emp {
     int m_Age;
     char m_Name[32];
    public:
     Emp();
     Emp(int age, char *n);
     virtual ~Emp();
     int GetAge() { return m_Age;}
     char *GetName() { return m_Name;}
     DisplayEmp(); 
     void Sort(void);
    }; 
    #endif //__CPPAPI_H__

    您可以做一個C介面如下:

    =========CWRAP.H檔案===========

    #ifndef __CWRAP_H__
    #define __CWRAP_H__

    #ifdef __cplusplus
    extern "C" {                  
    #endif               
    typedef int BOOL;
    typedef struct tagEmp {
     int age;
     char name[32];
    }CEmp; 

    void Sort(void);
    BOOL DeleteEmp(CEmp *pCEmp);
    BOOL DisplayEmp(CEmp *pCEmp);
    CEmp *CreateEmp(int age,char *n);

    #ifdef __cplusplus
    }                    
    #endif

    #endif //__CWRAP_H__

    ================CWRAP.CPP============

    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
       
    #include "cwrap.h"
    #include "cppapi.h"   
       
    Emp *pEmp;
       
    CEmp *CreateEmp(int age,char *n)   
    {  
     CEmp *pCEmp=(CEmp*)malloc(sizeof(CEmp));
     pEmp=new Emp(age,n);
     pCEmp->age=pEmp->GetAge();
     strcpy(pCEmp->name,pEmp->GetName());  
     return pCEmp; 
    }                         

    BOOL DeleteEmp(CEmp *pCEmp)
    {                               
     free(pCEmp);
     delete pEmp;
     return 0;
    }
    BOOL DisplayEmp(CEmp *pCEmp)
    {
     pEmp->DisplayEmp();
     return 0;
    }                                                    
    void Sort(void)
    {
     pEmp->Sort();
    }

    User就可以透過C介面使用C++類別的功能了

    tihs

    2006年10月18日 上午 01:17
  • HI,

    將C++類別的功能製作成COM工程比較浩大, 呼叫時Overhead也比較大, 困難度也較高, 做好之後所有的COM CLIENT都可以使用COM SERVER的功能

    tihs

    2006年10月18日 上午 01:19