C# 使用地址调用.Net函数

C# 使用地址调用.Net函数,c#,C#,我试图从本机代码和虚拟地址调用.NET函数。 我编写了一个简单的类库,它有一个类和静态方法,我使用 我还检查了ImageBase值是否为0x10000000 using System; // Token: 0x02000002 RID: 2 public class Class1 : object { // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250 public static int Cal

我试图从本机代码和虚拟地址调用.NET函数。 我编写了一个简单的类库,它有一个类和静态方法,我使用

我还检查了ImageBase值是否为0x10000000

using System;

// Token: 0x02000002 RID: 2
public class Class1 : object
{
    // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
    public static int Calculate(int x, int y)
    {
        return x + y;
    }
}
我正在查看文件,其中说明:

将指定的模块加载到调用模块的地址空间中 过程

当我调用calculate函数时,我得到了AV错误

ConsoleApplication1.exe中0x10002050处引发异常:0xC0000005:访问冲突执行位置0x100002050。发生

#include <Windows.h>
#include <iostream>

using namespace std;

typedef int(*Calculate)(int x, int y);

PVOID RvaToVa(PVOID rva, PVOID imageBase)
{
    return PVOID((int)rva + (int)imageBase);
}

int main()
{
    HMODULE hModule = LoadLibrary(L"ClassLibrary1.dll");
    if (!hModule)
    {
        cout << GetLastError() << endl;
        return 0;
    }

    PVOID fPtr = RvaToVa((PVOID)0x00002050, (PVOID)0x10000000);
    Calculate calculate = (Calculate)fPtr;

    if (calculate)
    {
        int result = calculate(31, 32);
        cout << result << endl;
    }
    FreeLibrary(hModule);
    return 0;
}
#包括
#包括
使用名称空间std;
类型定义int(*计算)(int x,int y);
PVOID rva(PVOID rva,PVOID imageBase)
{
返回PVOID((int)rva+(int)imageBase);
}
int main()
{
HMODULE HMODULE=LoadLibrary(L“ClassLibrary1.dll”);
if(!hModule)
{

您不能这样做。您需要加载并初始化CLR。程序集(编译成
.dll
文件的C#library)不是本机代码,而是编译成中间语言。没有运行时(CLR),您无法执行它。聪明的尝试,但我同意前面的评论。不可能,除非您针对的是普通的WINAPI、STDCALL或CDECL DLL(及其依赖项DLL可用),而不是需要运行时引擎的DLL。您可以使用非托管导出库来执行此操作,或将类作为ActiveX组件导出。请查看此处:谢谢@Alejandro我知道非托管导出库。