namespace dlltest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();        }
        [DllImport("identify.dll")]
        public static extern void getinfo(int[] b,string cwtxt);
        [DllImport("identify.dll")]
        public static extern int tell(int[] coordinateInner,int[] coordinateOuter,string cspic);         private void button1_Click(object sender, RoutedEventArgs e)
        {
            int frag1;
            int[] b;
            b = new int[16];
            int[] coordinateInner;
            coordinateInner = new int[8];
            int[] coordinateOuter;
            coordinateOuter = new int[8];
            string cspic;
            string cwtxt;
            cwtxt = "D:\\1234.txt";
            getinfo(b, cwtxt);
            coordinateOuter[0] = b[9];
            coordinateOuter[1] = b[11];
            coordinateOuter[2] = b[13];
            coordinateOuter[3] = b[15];
            coordinateOuter[4] = b[8];
            coordinateOuter[5] = b[10];
            coordinateOuter[6] = b[12];
            coordinateOuter[7] = b[14];            coordinateInner[0] = b[1];
            coordinateInner[1] = b[3];
            coordinateInner[2] = b[5];
            coordinateInner[3] = b[7];
            coordinateInner[4] = b[0];
            coordinateInner[5] = b[2];
            coordinateInner[6] = b[4];
            coordinateInner[7] = b[6];
            cspic = "D:\\待测图像1.bmp";
            frag1 = tell(coordinateInner, coordinateOuter, cspic);
            if (frag1 == 1)                MessageBox.Show("cwnyc");            else                MessageBox.Show("cwk");         
        }
    }
}
identify.dll在vc下调用没有问题,现在改用c#调用,程序运行时提示调用函数getinfo时貌似参数不符.....求解........
我在dll中给出的定义如下:void getinfo(int b[16],const char* cwtxt)
                  int tell(unsigned int coordinateInner[8],unsigned int coordinateOuter[8],const char* cspic)
dll是用vc写的

解决方案 »

  1.   

    运行时错误如下:A call to PInvoke function 'dlltest!dlltest.MainWindow::getinfo' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
    比较菜,希望说详细些
      

  2.   

    [DllImport("identify.dll"),
    EntryPoint="getinfo",
    CallingConvention =CallingConvention.Cdecl,   //注意,这里对应你VC实际的调用约定
    CharSet=CharSet.Ansi]
      public static extern void getinfo(int[] b,string cwtxt);
      

  3.   

    EntryPoint       .Cdecl       .Ansi 这三个有报错
      

  4.   

    额,是也应该放进括号里就好了,不报错了,但运行时出现错误Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
    指向在click事件中调用的另一个函数tell就是frag1=tell(....)这一行,这个.....又是为什么呢?
      

  5.   

    那说明是tell这个函数的申明错了,按照前面的改改啊。
      

  6.   

    [DllImport("identify.dll",
    EntryPoint="tell",
    CallingConvention =CallingConvention.Cdecl, //注意,这里对应你VC实际的调用约定
    CharSet=CharSet.Ansi)]
      public static extern int tell(uint[] coordinateInner,uint[] coordinateOuter,string cspic);  
      

  7.   

    是改了的...错误原因不同了,这次是:Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
      

  8.   

    VC:
    int tell(unsigned int coordinateInner[8],unsigned int coordinateOuter[8],const char* cspic)
    C#:
    [DllImport("identify.dll",EntryPoint="tell",CallingConvention =CallingConvention.Cdecl,CharSet=CharSet.Ansi)]
      public static extern int tell(uint[] coordinateInner,uint[] coordinateOuter,string cspic); 如果上一个没问题,从同一个dll来的,应该一样没有问题才对,你把C#这边的调用代码贴出来
      

  9.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;namespace dlltest
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();        }
            [DllImport("identify.dll",EntryPoint="getinfo",CallingConvention =CallingConvention.Cdecl,CharSet=CharSet.Ansi)]
             public static extern void getinfo(int[] b,string cwtxt);
            [DllImport("identify.dll",EntryPoint="tell",CallingConvention =CallingConvention.Cdecl,CharSet=CharSet.Ansi)]
            public static extern int tell(uint[] coordinateInner,uint[] coordinateOuter,string cspic);         private void button1_Click(object sender, RoutedEventArgs e)
            {
                int frag1;
                int[] b;
                b = new int[16];
                uint[] coordinateInner;
                coordinateInner = new uint[8];
                uint[] coordinateOuter;
                coordinateOuter = new uint[8];
                string cspic;
                string cwtxt;
                cwtxt = "D:\\1234.txt";
                getinfo(b, cwtxt);
                coordinateOuter[0] = (uint)b[9];
                coordinateOuter[1] = (uint)b[11];
                coordinateOuter[2] = (uint)b[13];
                coordinateOuter[3] = (uint)b[15];
                coordinateOuter[4] = (uint)b[8];
                coordinateOuter[5] = (uint)b[10];
                coordinateOuter[6] = (uint)b[12];
                coordinateOuter[7] = (uint)b[14];            coordinateInner[0] = (uint)b[1];
                coordinateInner[1] = (uint)b[3];
                coordinateInner[2] = (uint)b[5];
                coordinateInner[3] = (uint)b[7];
                coordinateInner[4] = (uint)b[0];
                coordinateInner[5] = (uint)b[2];
                coordinateInner[6] = (uint)b[4];
                coordinateInner[7] = (uint)b[6];
                cspic = "D:\\待测图像1.bmp";
                frag1 = tell(coordinateInner, coordinateOuter, cspic);
                if (frag1 == 1)                MessageBox.Show("cwnyc");            else                MessageBox.Show("cwk");         
            }
        }
    }
    没有error,只是运行时报那个错attempt to 。
      

  10.   

    两个建议:
    1、加上try{}catch{}
    2、屏蔽下面代码在测试: //coordinateOuter[0] = (uint)b[9];
      //coordinateOuter[1] = (uint)b[11];
     // coordinateOuter[2] = (uint)b[13];
      //coordinateOuter[3] = (uint)b[15];
      //coordinateOuter[4] = (uint)b[8];
      //coordinateOuter[5] = (uint)b[10];
      //coordinateOuter[6] = (uint)b[12];
      //coordinateOuter[7] = (uint)b[14];  //coordinateInner[0] = (uint)b[1];
      //coordinateInner[1] = (uint)b[3];
      //coordinateInner[2] = (uint)b[5];
      //coordinateInner[3] = (uint)b[7];
      //coordinateInner[4] = (uint)b[0];
      //coordinateInner[5] = (uint)b[2];
      //coordinateInner[6] = (uint)b[4];
      //coordinateInner[7] = (uint)b[6];
      

  11.   

    谢谢谢谢,我找到问题所在了,我的dll中调用了一张图片,而该图片必须放在debug下才可以,原来我的vc++程序是带有图片的......是我的问题,呵呵,谢啦,结贴给分