gpt4 book ai didi

c# - 调用 native C++ 方法时在 Debug模式 (F5) 下崩溃

转载 作者:行者123 更新时间:2023-11-30 01:55:39 24 4
gpt4 key购买 nike

我正在尝试使用 LoadLibrary、GetProcAddress 和 GetDelegateForFunctionPointer 调用 C++ 方法。

如果我运行 .NET 4.0 应用程序 (Ctrl + F5),一切正常(在发布和调试中)。但是当我启动 Debug模式 (F5) 时,当我调用 C++ 方法时程序崩溃。

.cpp:

#include "PointEntree.h"
#include <stdio.h>
extern "C" __declspec( dllexport ) int Test1(int a)
{
printf("coucou\n");
return 0;
}

.h:

extern "C" __declspec( dllexport ) int Test1(int);

.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace NETProgram
{
static class NativeMethods
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);

[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
}

class Program
{
delegate int Bambou_Test1(int i);

static void Main(string[] args)
{
IntPtr pDll = NativeMethods.LoadLibrary(@"E:\Dev\C#\ImportC++\Bambou\Release\Bambou.dll");
IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "Test1");

Bambou_Test1 method = (Bambou_Test1)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(Bambou_Test1));
method.Invoke(12);
}
}
}

如果我使用像下面这样的经典 DLL 导入,它可以工作,但这不是我想要实现的:

[DllImport(@"E:\Dev\C#\ImportC++\Bambou\Debug\Bambou.dll", EntryPoint = "Test1",  CallingConvention=CallingConvention.Cdecl)]
public static extern int Test1(int a);

如果有人有任何想法,那就太好了!

最佳答案

P/Invoke 主要设计用于与 Windows API 互操作,因此默认使用 StdCall 约定。 C 默认使用 Cdecl 约定。您需要更改其中一侧以明确指定调用约定,以便它在两侧都匹配。

您的经典 DLL 导入使用 [DllImport(..., CallingConvention=CallingConvention.Cdecl) 指定约定,基于 GetDelegateForFunctionPointer 的变体未指定调用约定(因此使用 StdCall)。您需要使用 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 指定它。

如果没有附加调试器,您的代码同样错误,它只是隐藏了错误。通常,这种不匹配会使堆栈指针失衡,从而导致即时崩溃,但 .net 编码代码似乎对堆栈指针进行了特殊处理,从而避免了崩溃。没有调试器会默默吞下错误,有调试器会显示错误。

关于c# - 调用 native C++ 方法时在 Debug模式 (F5) 下崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com