在C#中通过地址调用非托管fastcall C函数

问题描述 投票:0回答:1

我正在将 C# dll 注入到用 C 编写的非托管进程中。我将如何在此进程中调用函数?我知道函数的地址和函数签名。该函数使用

fastcall
调用约定。我不确定这是否会让事情变得复杂。

我尝试过像这样使用代表:

    [UnmanagedFunctionPointer(CallingConvention.FastCall, CharSet = CharSet.Unicode)]
    public delegate IntPtr _PrintText(string msg, int color);

这会引发关于

FastCall
不受支持的警告。

这是我尝试过的更完整、简单的示例:

C++函数:

void __fastcall PrintText (wchar_t * wMessage, int nColor)
Address: 0x31E3A0

C#代码:

public class Example
{
    [UnmanagedFunctionPointer(CallingConvention.FastCall, CharSet = CharSet.Unicode)]
    public delegate IntPtr _PrintText(string msg, int color);

    public static int EntryPoint(string pwzArgument)
    {
        var ptr = new IntPtr(0x31E3A0);
        _PrintText MyPrint = Marshal.GetDelegateForFunctionPointer<_PrintText>(ptr);
        MyPrint("TESTING", 0);
    }
}

如何使用 C# 正确定义和调用

FastCall
C 函数?

c# c .net pointers dll
1个回答
0
投票

不幸的是,

fastcall
不可用于从托管代码调用。它应该只适用于
Mono
NativeAOT

© www.soinside.com 2019 - 2024. All rights reserved.