我正在做一个项目,目前有以下结构:
- C# WPF 项目包含用户界面以及对外部方法的调用。
- 包含算法的 C++ DLL 项目。
- 包含算法的 ASM DLL 项目。
为简单起见,我们假设该算法不带参数并返回两个预定义数字的总和。
这是C++(第二个)项目中的函数签名和实现:
int Add(int x, int y)
{
return x + y;
}
extern "C" __declspec(dllexport) int RunCpp()
{
int x = 1, y = 2;
int z = Add(x, y);
return z;
}
以下是我在 C# 中调用函数的方式:
[DllImport("Algorithm.Cpp.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int RunCpp();
这工作得很好——在 C# 中调用函数返回值 3,一切正常,没有抛出异常。
但是,我现在正在努力在 C# 代码中调用 ASM 过程。我已经看到(并在一定程度上测试了自己)不可能直接在 C# 代码中调用 MASM DLL。但是,我听说可以在 C++ 中调用 ASM 并在 C# 中调用该函数。
1.我的第一个问题是——实际上可以直接在 C# 中调用 ASM 代码吗?当我尝试这样做时,我得到一个异常,基本上说二进制代码不兼容。
2、我曾尝试使用C++间接调用ASM DLL,虽然没有异常,但返回的值是“随机的”,就像在内存中留有余数一样,例如:-7514271。这是我做错了什么,还是有其他方法可以实现这一目标?
下面是在 C++ 中调用 ASM 的代码:
typedef int(__stdcall* f_MyProc1)(DWORD, DWORD);
extern "C" __declspec(dllexport) int RunAsm()
{
HINSTANCE hGetProcIDDLL = LoadLibrary(L"Algorithm.Asm.dll");
if (hGetProcIDDLL == NULL)
{
return 0;
}
f_MyProc1 MyProc1 = (f_MyProc1)GetProcAddress(hGetProcIDDLL, "MyProc1");
if (!MyProc1)
{
return 0;
}
int x = 1, y = 2;
int z = MyProc1(x, y);
FreeLibrary(hGetProcIDDLL);
return z;
}
这里,在 C# 中调用 C++ 的代码:
[DllImport("Algorithm.Cpp.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int RunAsm();
如果需要,这里是 ASM 代码MyProc1
:
Main.asm:
MyProc1 proc x: DWORD, y: DWORD
mov EAX, x
mov ECX, y
add EAX, ECX
ret
MyProc1 endp
主要定义:
LIBRARY Main
EXPORTS MyProc1