恩 谢谢iyomumx 我知道是这么做,但是主要怎么定义,什么形式,主要就是这不会写,这个思想我知道 

解决方案 »

  1.   

    委托的定义和导出函数的定义相似,只是使用UnmanagedFunctionPointer特性来调整调用约定和字符集:
            [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
            delegate void ecmic_onevent
            (
                IntPtr data,
                int sid,
                [MarshalAs(UnmanagedType.LPStr)]string evt,
                [MarshalAs(UnmanagedType.LPStr)]string confno,
                int mid,
                [MarshalAs(UnmanagedType.LPStr)]string inviteid,
                [MarshalAs(UnmanagedType.LPStr)]string caller,
                [MarshalAs(UnmanagedType.LPStr)]string callee
            );
            [DllImport("libecmic.dll", EntryPoint = "ecmic_setevent", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
            void ecmic_setevent(ecmic_onevent evt, IntPtr data);
    可以考虑定义data为object
      

  2.   

    谢谢,能在帮我解决一个问题吗,我现在需要把这个封装到C#做的COM里供别的语言调用比如VB,那么我C#该怎么写呢我现在写到这了 [Guid("EA84B01B-BC5C-4B92-999D-3181837778AF"), ClassInterface(ClassInterfaceType.None)]
        public class Class1 : MyCom_Interface
        {
             [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
             delegate void ecmic_onevent
             (
                 object data,
                 int sid,
                 [MarshalAs(UnmanagedType.LPStr)]string evt,
                 [MarshalAs(UnmanagedType.LPStr)]string confno,
                 int mid,
                 [MarshalAs(UnmanagedType.LPStr)]string inviteid,
                 [MarshalAs(UnmanagedType.LPStr)]string caller,
                 [MarshalAs(UnmanagedType.LPStr)]string callee
             );
             [DllImport("libecmic.dll", EntryPoint = "ecmic_setevent", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
             void ecmic_setevent(ecmic_onevent evt, object data);
           
            public void ecmic_setevents(ecmic_onevent evt, object data)
            {
                ecmic_setevent(evt, data);
            }
    }[Guid("24D52DF9-9426-4887-A849-31B3E5B4BBCE")]
        public interface MyCom_Interface
        {
      [DispId(1)]
      这里怎么写呢?
    }谢谢
      

  3.   

    如果你的C#代码只是弄个封装,那还不如用C++来写……
    COM是没有函数指针/委托这种概念的,像VB6就不支持,你需要利用ComSourceInterfaces特性公开一个COM事件
      

  4.   

    因为对C++不是很熟所以想用C#封装一个COM接口供VB调用,您说的ComSourceInterfaces特性公开一个COM事件,这个是C#的吗,如果是您能教教我吗,如果不是解决方案只有用C++封装?谢谢
      

  5.   

    C#的com封装完还是需要dotnet的框架才能使用,而且注册也和传统的windows的Com不同。
    [DispId(1)]
            string Test_DLLCONN(string Data);
    你要给其他用户提供什么接口,就定义什么接口。
      

  6.   

    我已经解决,顺便问一下,拿C#封装的COM,没使用任何控件,如果VB或别的调用客户机上需要安装.netFramework 吗
      

  7.   

    我好奇怪哦!
    VB 不是可以直接使用 API 的吗。
    VB 是可以直接使用普通的 DLL 的导出符号的。