vs2013 c#调用c++ dll------实例托管的PInvoke签名与非托管的目标签名不匹配问题以及解决。

首先自己用vs创建一个c++ dll,然后用depends查看导出的函数,如图:
这里是自己写的测试dll,下面有两个函数,创建c++dll的方法查看这篇博客:
https://blog.csdn.net/Alan_Program/article/details/93172050
vs2013 c#调用c++ dll------实例托管的PInvoke签名与非托管的目标签名不匹配问题以及解决。_第1张图片
以下是错误实例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;   //dllimport需要的头文件

namespace csCallCPPDllDemo
{
    class Program
    {
        [DllImport(@"MyMath.dll", EntryPoint = "my_add", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.stdcall)]
        //[DllImport(@"E:\VS\VS_project\vs2013project_cs\csCallCPPDllDemo\csCallCPPDllDemo\testDll\MyMath.dll")]
        extern static Int32 my_add(Int32 a, Int32 b);


        [DllImport(@"MyMath.dll", EntryPoint = "my_sub", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.stdcall)]
        //[DllImport(@"E:\VS\VS_project\vs2013project_cs\csCallCPPDllDemo\csCallCPPDllDemo\testDll\MyMath.dll")]
        extern static Int32 my_sub(Int32 a, Int32 b);

        static void Main(string[] args)
        {
            int r1 = my_add(9, 6);
            int r2 = my_sub(9, 6);

            Console.WriteLine("my_add结果:" + r1.ToString());
            Console.WriteLine("my_sub结果:" + r2.ToString());
            Console.ReadKey();
        }
    }
}

然后就会报错:
在这里插入图片描述
或者是:
托管的PInvoke签名与非托管的目标签名不匹配

解决方法:
C#调用DLL中的函数出现“原因可能是托管的PInvoke签名与非托管的目标签名不匹配”,原因是DLL中声明的接口缺少CallingConvention参数以及没有正确使用调用约定。
有两种解决方式:
1. 改C#中的声明:如
[DllImport(“winmm.dll”, EntryPoint =“sndPlaySoundA”,)]
为[DllImport(“winmm.dll”, EntryPoint =“sndPlaySoundA”,CallingConvention = CallingConvention.Cdecl)]
2. DLL的导出函数前声明__stdcall。

所以直接需要将代码里的调用约定修改一下即可。
CallingConvention.stdcall改为CallingConvention = CallingConvention.Cdecl)
就可以得到如下结果:
vs2013 c#调用c++ dll------实例托管的PInvoke签名与非托管的目标签名不匹配问题以及解决。_第2张图片

注意:dllimport导入dll路径有两种方法:
绝对路径:[DllImport(@“C:\Users\LC\Desktop\Test.dll”)]
相对路径:[DllImport(“Test.dll”)]//这种方式必须将dll文件放到工程目录bin\debug下

你可能感兴趣的:(c#,笔记)