C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在将C DLL包含到C#中时,对PInvoke函数的调用使堆栈不平衡大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我编写了一个C DLL和一些C#代码来测试包含这个DLL并从中执行函数.我对这个过程并不太熟悉,每当从C#源代码调用DLL函数时,我都会收到PInvokeStackImbalance异常.代码如下(我已经评论了大多数代码来隔离这个问题):

C#包含代码

using System;
using System.Runtime.Interopservices;
using System.IO;

namespace TESTConsoleGrids
{
    class Program
    {

        [DllImport("LibNonthreaded.dll",EntryPoint = "process")]
            public unsafe static extern void process( long high,long low);

        static void Main(String[] args)
        {
            System.Console.WriteLine("StarTing program for 3x3 grid");

            process( (long)0,(long)0 );

            System.Console.ReadKey();
        }
    }
}

C DLL函数代码

extern "C" __declspec(dllexport) void process( long high,long low );

void process( long high,long low )
{
    // All code commented out
}

Visual studio生成了dllmain代码(我不明白这个构造,所以我包括它)

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
      )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
  break;
 }
 return TRUE;
}

例外的细节是:

解决方法

调用约定是错误的.如果删除int参数不会使MDA跳闸,那么它就是Cdecl:

[DllImport("LibNonthreaded.dll",CallingConvention = CallingConvention.Cdecl)]
 public static extern void process(int high,int low);

这不是导出的DLL函数的标准调用约定,如果可以,您可以虑在C/C++代码中更改它.

大佬总结

以上是大佬教程为你收集整理的在将C DLL包含到C#中时,对PInvoke函数的调用使堆栈不平衡全部内容,希望文章能够帮你解决在将C DLL包含到C#中时,对PInvoke函数的调用使堆栈不平衡所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。