dllimport:使用变形的名称时,传递的参数已损坏

时间:2019-02-08 11:31:23

标签: c# c++ dllimport

当我尝试使用名称混乱的DLL时,我看到一个奇怪但始终如一的行为,即最后传递的参数已损坏/未初始化。

当我使用“ extern“ C”编译下面的代码时,它可以正常工作,但是我非常希望有重载方法的可能性,因此可以使用错误的名称。一切都以64位编译。

MyDll.h:

#define MYDLL_API __declspec(dllexport)
class myDll
{
    public:
    MYDLL_API int Add(int, int);
    MYDLL_API int Sub(int, int);
};

myDll.cpp:

int myDll::Add(int a, int b)
{
    printf("a is %d, b is %d\n", a, b);
    return a + b;
}

int myDll::Sub(int a, int b)
{
    printf("a is %d, b is %d\n", a, b);
    return a - b;

}

dumpbin的输出:

Dump of file .\myDll.dll

File Type: DLL

  Section contains the following exports for myDll.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0001101E ?Add@myDll@@QEAAHHH@Z = @ILT+25(?Add@myDll@@QEAAHHH@Z)
          2    1 0001131B ?Sub@myDll@@QEAAHHH@Z = @ILT+790(?Sub@myDll@@QEAAHHH@Z)

我导入DLL的应用程序是用C#编写的

namespace UseMyDll
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = Add(1, 2);
            int b = Sub(2, 1);
        }

        [DllImport("myDll.dll",
            EntryPoint = "?Add@myDll@@QEAAHHH@Z",
            ExactSpelling = true,
            CallingConvention = CallingConvention.Cdecl)]
        public static extern int Add(int a, int b);

        [DllImport("myDll.dll",
            EntryPoint = "?Sub@myDll@@QEAAHHH@Z",
            ExactSpelling = true,
            CallingConvention = CallingConvention.Cdecl)]
        public static extern int Sub(int a, int b);
    }
}

运行C#程序的输出:

a is 2, b is -1588955232
a is 1, b is -1588955232

从程序输出中可以看出,传递的最后一个参数与我期望的不完全相同。关于我在做什么错的任何提示吗?

0 个答案:

没有答案