/**
 * @file   IAudienceManager.h
 * @author Jenny
 * @date   May 7, 2012
 * 
 * @brief  Interface of Audience Manager.
 */#ifndef _AUDIENCE_MANAGER_H_
#define _AUDIENCE_MANAGER_H_#define _API_IAUDIENCE_EXPORT#define _IAUDIENCE_EXTERN extern "C"#if defined _API_IAUDIENCE_EXPORT
#define _IAUDIENCE_EXPORT __declspec(dllexport)
#define _IAUDIENCE_STDCALL __stdcall
#else
#define _IAUDIENCE_STDCALL
#define _IAUDIENCE_EXPORT 
#endiftypedef int INT32;
typedef unsigned int UINT32;
typedef short SINT16;typedef struct AUDIENCE
{

INT32 X; INT32 Y;

INT32 W; INT32 H;

int gender; int age;

float watchingtime; struct  
{
SINT16 year;
SINT16 mon;
SINT16 day;
SINT16 hour;
SINT16 min;
SINT16 sec;
} turnupTM; 
//ID label of the audience;
UINT32 audID;
}AUDIENCE;
class IAudienceManager
{
public: virtual void _IAUDIENCE_STDCALL UpdateFrame(const char *bFrame)=0;

virtual UINT32 _IAUDIENCE_STDCALL GetAudienceList(AUDIENCE *outAudienceList,UINT32 maxLen)=0;

virtual UINT32 _IAUDIENCE_STDCALL GetValidMaxAudience(AUDIENCE &outAudience)=0;

virtual UINT32 _IAUDIENCE_STDCALL GetDisappearedAudienceList(AUDIENCE *outDisappearedAudienceList,UINT32 maxLen)=0; virtual _IAUDIENCE_STDCALL ~IAudienceManager(){}
};
_IAUDIENCE_EXTERN _IAUDIENCE_EXPORT IAudienceManager* _IAUDIENCE_STDCALL CreateAudienceManager(INT32 imW,INT32 imH);_IAUDIENCE_EXTERN _IAUDIENCE_EXPORT int _IAUDIENCE_STDCALL ReleaseAudienceManager(IAudienceManager** pAudManager);#endif
本人不熟悉C++,但是现在公司有个项目要用到C++的一个dll ,我上网查了一下说要用dllimport之类的
上面是C++的.h文件包含了所有的方法,请问我在C#中如何引用所有的方法。

解决方案 »

  1.   

    非托管资源引用使用dllimport结合extern 关键字例子[DllImport("kernel32")]//括号里是dll的名字
    private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);//方法声明
      

  2.   

    CreateAudienceManager返回IAudienceManager,而IAudienceManager是一个类,估计这样的函数没法用Platform invoke调用。
      

  3.   

    请问2楼,如果不行,我在C#中应该要怎么使用C++的dll呢,现在做C++的同事又不会C#,我们都迷茫的。。
    我查了一下调用结构体的话可以用类似下面的方法,那个IAudienceManager接口不行吗?
    [StructLayout(LayoutKind.Explicit)] 
    public struct myStruct_t{
        [FieldOffset(0)]     //就是起始地址,所以位移为0
        public int a;        
        [FieldOffset(4)]     //相对于起始地址,位移一个int,32位机上是4个字节
        public int b;        
        [FieldOffset(8)]     //相对于起始地址,位移2个int,就是8个字节
        public char c;
    }
     [DllImport("ExportFun.dll", EntryPoint = "mymath3")]
    private static extern IntPtr mymath3();
     
    IntPtr pT = mymath3();
    myStruct_t mt = new myStruct_t();
    mt = (myStruct_t)Marshal.PtrToStructure(pT, mt.GetType());
    在C++中的是这样的
    .hstruct MYSTRUCT_T
    {
        int a;
        int b;
        char c;
    };_declspec(dllexport)  MYSTRUCT_T* mymath3();.cppMYSTRUCT_T* mymath3()
    {
        MYSTRUCT_T* pT = new MYSTRUCT_T();    pT->a = 500;
        pT->b = 600;
        pT->c = 'A';    return pT;
    }
      

  4.   

    你手头上肯定有C++开发人员开发的dllDemo.dll,比如这个dllDemo.dll就只有求和,求最大值,求最小值的DLL,他们已经为你打包好了,那么下面举个例子,如何调用这个DLL//在c#中调用。新建,项目,控制台应用程序。(注意是C#,不是C#环境您重新切一下),
    //在Program.cs中贴入以下代码:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;//引入dll文件中的函数   
     class Program    
    {        //引入dll文件中的函数        
    [DllImport("dllDemo.dll")]        private static extern int Sum(int a, int b);        [DllImport("dllDemo.dll")]        private static extern int Max(int a, int b);        [DllImport("dllDemo.dll")]        private static extern int Min(int a, int b);       
     static void Main(string[] args)       
     {    int a = Sum(3, 5);           
     Console.WriteLine(a);           
     Console.WriteLine(Max(5,10));          
      Console.WriteLine(Min(12,25));            
    Console.ReadKey();//直接main里边最后加个Console.Read()不就好了。要按键才退出。 }   
     }
      

  5.   

    你手头上肯定有C++开发人员开发的dllDemo.dll,比如这个dllDemo.dll就只有求和,求最大值,求最小值的DLL,他们已经为你打包好了,那么下面举个例子,如何调用这个DLL//在c#中调用。新建,项目,控制台应用程序。(注意是C#,不是C#环境您重新切一下),
    //在Program.cs中贴入以下代码:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;//引入dll文件中的函数   
    class Program
    {        //引入dll文件中的函数        
        [DllImport("dllDemo.dll")]
        private static extern int Sum(int a, int b);
        [DllImport("dllDemo.dll")]
        private static extern int Max(int a, int b);
        [DllImport("dllDemo.dll")]
        private static extern int Min(int a, int b);
        static void Main(string[] args)
        {
            int a = Sum(3, 5);
            Console.WriteLine(a);
            Console.WriteLine(Max(5, 10));
            Console.WriteLine(Min(12, 25));
            Console.ReadKey();//直接main里边最后加个Console.Read()不就好了。要按键才退出。 }   
        }
    }
      

  6.   


    这里的sum,max 还有min,就是C++编写的 DLL中 对应你的这个项目的DLL中声明的函数IAUDIENCE_EXTERN _IAUDIENCE_EXPORT IAudienceManager* _IAUDIENCE_STDCALL CreateAudienceManager(INT32 imW,INT32 imH);_IAUDIENCE_EXTERN _IAUDIENCE_EXPORT int _IAUDIENCE_STDCALL ReleaseAudienceManager(IAudienceManager** pAudManager);
      

  7.   

    有开发人员就好办多了,可以用Managed C++封装一层。
      

  8.   

    谢谢。。我想再问下可以让C++同事做成com组件可不可以。我再C#中调用是否会容易
      

  9.   

    封装成DLL,你调用已经很方便了。其实