C++ 从C+调用C DLL+;提供访问冲突,但DllImport正在工作的C#项目

C++ 从C+调用C DLL+;提供访问冲突,但DllImport正在工作的C#项目,c++,c,dll,C++,C,Dll,我有一个需要集成的32位第三方C DLL,但遇到了一个难以理解/跟踪的错误 < >我可以编译并成功连接一个简单的C++ 32位应用程序,包括以下内容: #include "stdafx.h" #include <windows.h> extern "C" int __stdcall external_method(int cardno); int main() { int n = external_method(0); return 0; } Unhandled

我有一个需要集成的32位第三方C DLL,但遇到了一个难以理解/跟踪的错误

< >我可以编译并成功连接一个简单的C++ 32位应用程序,包括以下内容:

#include "stdafx.h"
#include <windows.h>

extern "C" int __stdcall external_method(int cardno);

int main()
{
    int n = external_method(0);
    return 0;
}
Unhandled exception at 0x100AADF5 (ExternalModule.dll) in 
ConsoleApplication2.exe: 0xC0000005: Access violation reading location 0x00000000.
但是,如果我创建一个简单的C#应用程序,使用DllImport/PInvoke调用相同的函数,它运行良好:

namespace ConsoleApplication3
{
    class Program
    {
        [DllImport("ExternalModule.dll")]
        public static extern int external_method(int n);

        static void Main(string[] args)
        {
            external_method(0);
            Debug.WriteLine("YES!");
        }
    }
}
我很难理解一个怎么工作,另一个怎么失败。不幸的是,我无法访问C DLL的开发人员

非常感谢您的帮助

更新谢谢你的评论。以下是该方法的头文件条目:

int __stdcall exernal_method(int cardno);
我有理由确信呼叫约定是正确的。正在加载DLL,因为使用DLL的调试版本,我可以看到它在失败之前将一些消息输出到调试输出


堆栈在方法退出时被损坏,这可能是一个问题吗?我尝试了几种不同的调用约定,但这是链接器能够使用的唯一约定。

堆栈损坏的可能性不大

一个可能的原因是不同的DLL加载方法。您的C++应用程序静态加载(Windows在进程启动之前加载DLL),动态地动态调用C(CLR在进程启动后加载DLL)。要测试这个假设,请移除链接器中的外部模块.LIB,更改C++代码来调用LoadLibrary和GETPROCEDATION。

另一个可能的原因是C运行时初始化COM,C++应用程序不,而你的DLL尝试使用COM。在C++应用程序中,尝试在您的OpnLaLy方法之前添加CONPROCEDALID[EX]。< /P>不是一个C用户,但是它可能是一个调用约定不匹配吗?C和C代码之间没有区别。你必须寻找一个环境原因。一个电话号码。你的C++程序找不到DLL,还是找不到它的不同版本?链接器可能只是链接到导入库,所以它不会抱怨。调试器或它没有发生这是第二个原因!感谢you@jugglingcats不客气。也不要忘记初始化。通常它应该在线程退出之前完成。