我很惊讶问题标题和 C# 代码中的“调用约定”没有响起任何铃声(尽管我不排除MS方面的误导性错误消息)。CallingConvention
调用约定就像执行子程序时的协议,在:
- callee - 例程(函数、过程(或不返回任何内容的函数,或返回
void
))
- caller
main
-调用/执行被调用者的代码(也可以是子例程)
并确定:
- 谁在执行时处理(推送/弹出)堆栈上的函数参数(被调用者/调用者)
- 堆栈上的参数顺序(右 -> 左或左 -> 右)
因为#1。,重要的是 2 方(被调用者/调用者)在调用约定方面保持同步,否则他们会互相干扰,堆栈最终会损坏。“ Bad DLL Calling Convention ”就是这个意思:两者不同步。
我拿了你的代码,玩了一下。
代码.cs:
using System;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;
namespace RSExternalInterface
{
public class RSExternalInterface
{
[DllExport("add")]
public static int TestExport(int left, int right)
{
int ret = left + right;
String s = String.Format("C# Func - add: {0} + {1} = {2}", left, right, ret);
Console.WriteLine(s);
return ret;
}
[DllExport("dbl", CallingConvention = CallingConvention.Winapi)]
public static int TestExport1(int value)
{
int ret = value * 2;
String s = String.Format("C# Func - dbl: {0} * 2 = {1}", value, ret);
Console.WriteLine(s);
return ret;
}
[DllExport("none", CallingConvention = CallingConvention.StdCall)]
public static void TestExport2(int value)
{
String s = String.Format("C# Func - none: {0}", value);
Console.WriteLine(s);
}
}
}
主.vb:
Module main
Declare Function add Lib "CsDll.dll" (ByVal Left As Integer, ByVal Right As Integer) As Integer
Declare Function dbl Lib "CsDll.dll" (ByVal Value As Integer) As Integer
Declare Sub none Lib "CsDll.dll" (ByVal Value As Integer)
Sub Main()
Console.WriteLine("64 bit OS: {0}{1}64 bit process: {2}{1}", Environment.Is64BitOperatingSystem, Environment.NewLine, Environment.Is64BitProcess)
Dim i As Integer
none(-7659)
i = dbl(78)
i = add(22, -13)
End Sub
End Module
备注:
- 我无法在Excel中构建和运行它,所以我尝试了第二个最好的方法:从VB中执行。请注意,我对C#和VB都没有经验
- 一开始(正如我在评论中所说),我无法从C# .dll中导出任何内容。查看UnmanagedExports.nuspec(nupkg的一部分):
- 您必须将平台目标设置为 x86、ia64 或 x64。AnyCPU 程序集无法导出函数。
- 将平台从任何 CPU(VStudio默认)更改为x64(错误地),一切运行良好(尽管如此
CallingConvention.Cdecl
),只有在将其设置为x86后,我才能重现该问题
- 无论如何,(C#)代码包含 3 种(不)指定调用约定的方法,这将在VB中工作
输出(VStudio 2015(社区)):
64 bit OS: True
64 bit process: False
C# Func - none: -7659
C# Func - dbl: 78 * 2 = 156
C# Func - add: 22 + -13 = 9
这是一个(古老的)URL,它也提到了您的错误:[MSDN]: Bad DLL calling convention (Error 49)