none
C#调用C++类库的问题 RRS feed

  • 问题

  • C++代码如下:

      extern "C" __declspec(dllexport) int Add(int x,int y) 
      { 
     return x+y;
      }

    C#代码如下:

            [DllImport("D:\\dllTest\\Debug\\MyTest.dll")]
            public static extern int Add(int x, int y);

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    int result = Add(1,2);
                    MessageBox.Show(result.ToString());
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

    现在经过测试发现如下问题:

    1.如果在没有方法参数的情况下,C#(4.0和3.5都可以)可以调用C++ DLL文件中的方法

    2.如果有方法参数(x,y),那么C#只能在FrameWorkElement3.5框架下调用C++的DLL文件,在4.0中调用会报错,错误信息如下:

    对 PInvoke 函数“ConsoleApplication1!ConsoleApplication1.Program::Add”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的        目标签名不 匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

    请高手解答一下

    灰常感谢


    我是一只猪

    2012年9月13日 4:21

答案

  • 知道怎么回事了

    设置 CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl 就可以了,继续研究中


    我是一只猪

    2012年9月13日 6:53

全部回复

  • 知道怎么回事了

    设置 CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl 就可以了,继续研究中


    我是一只猪

    2012年9月13日 6:53
  • Hi 槑 -_- 槑,

      欢迎来到MSDN论坛。

      很高兴听到你通过修改CallingConvention 属性让Pinvoke实现起来,同时感谢你在论坛里分享你的经验。

     


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月14日 3:11
    版主