none
c#调用c++方法的参数问题 RRS feed

  • 问题

  • 想在C#中调用一个C++ SDK的函数,函数的某个参数是一个拥有多个方法的class,请问在C#中如何表示这个参数

    Demo:

    c++ code:

    class A
    {
       virtual onJoinSuccess(int code);
       virtual onJoinFailed(int code);
    };

    public CppMethod(char* msg,A* callback);

    c# code:

    [DllImport("c++ dll path", EntryPoint = "CppMethod")]
     public static extern int CppMethod(string msg, ??? );

    c#如何表示A* callback

    2021年4月13日 3:55

答案

  • .net语言,例如c#,不能调用任何c++ dll,只能调用c dll,p/invoke从来都不支持c++接口,必须是c接口,因此不可能调用什么virtual函数。
    • 已标记为答案 bp_l 2021年4月13日 11:39
    2021年4月13日 10:42

全部回复

  • 你好,

    你可以在c++代码中定义以下的方法。

    extern "C" {
    
        __declspec(dllexport) void* MyClass_Create() {
            return new A();
        }
    }

    然后你可以在c#写下下面的代码:

           [DllImport("TestDll.dll")]
            internal static extern IntPtr MyClass_Create();
    
            [DllImport("TestDll.dll", EntryPoint = "CppMethod")]
            public static extern int CppMethod(string msg, IntPtr Myclass );
            static void Main(string[] args)
            {
                IntPtr pTestClass = MyClass_Create();
                CppMethod("test", pTestClass);
            }

    希望可以帮助你

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2021年4月13日 9:11
    版主
  • 谢谢您的回复,实际上我想在c#中监听下面两个回调方法

       virtual onJoinSuccess(int code);
       virtual onJoinFailed(int code);

    是否可以在c#中写个struct A

     [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
     public delegate void onJoinRoomSuccess(int code);

     [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
     public delegate void onJoinRoomFailure(int code);

    public struct A
    {
         public onJoinRoomSuccess  success;
         public onJoinRoomFailure  failure;

    }

    ----------------------------------------------

    A a= new A();
    a.success= new onJoinRoomSuccess(successMethod);
    a.failure= new onJoinRoomFailure(failureMethod);

    CppMethod("test",ref A)

    但会报错:尝试读取或写入受保护的内存

    2021年4月13日 9:33
  • .net语言,例如c#,不能调用任何c++ dll,只能调用c dll,p/invoke从来都不支持c++接口,必须是c接口,因此不可能调用什么virtual函数。
    • 已标记为答案 bp_l 2021年4月13日 11:39
    2021年4月13日 10:42