调用C++;C#中的DLL在Windows 7下正常,但在Windows 10下失败 < >我的程序从C++程序调用C++ dll。

调用C++;C#中的DLL在Windows 7下正常,但在Windows 10下失败 < >我的程序从C++程序调用C++ dll。,c#,c++,dll,language-interoperability,C#,C++,Dll,Language Interoperability,问题是生成的可执行文件运行的是良好的undex Windows 7,而不是Windows 10 步骤如下所示: < >我用64位的G++(TDM GCC-64)编译我的C++ DLL。 我使用Visual studio 15和目标.NET framework 4.5.2以64位编译我的C#程序 < > C++ DLL代码为: main.h 注意:构建是在最终目标平台Win10 64位上完成的 在Windows 10上运行时,我有以下功能: void DLL_EXPORT SomeFunction

问题是生成的可执行文件运行的是良好的undex Windows 7,而不是Windows 10

步骤如下所示:

< >我用64位的G++(TDM GCC-64)编译我的C++ DLL。 我使用Visual studio 15和目标.NET framework 4.5.2以64位编译我的C#程序

< > C++ DLL代码为:

main.h 注意:构建是在最终目标平台Win10 64位上完成的

在Windows 10上运行时,我有以下功能:

void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
dllCall…
异常:无法加载DLL“myDLL.DLL”:动态链接库(DLL)初始化例程失败。(来自HRESULT的异常:0x8007045A) System.DllNotFoundException:无法加载DLL“myDLL.DLL”:动态链接库(DLL)初始化例程失败。(HRESULT异常:0x8007045A) §ProgramTest.SomeFunction(字符串sometext) §ProgramTest.dllCall()dans C:\TestDllCall\TestDllCall\Program.cs:ligne 30

将整个生成目录从Win10复制到Win7之后, 在我的Win7上运行它,我有以下几点:

void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
dllCall
来自DLL的测试:您好

很好用

如果有人知道为什么它在Win10下失败,而不是在Win7下失败,我会很高兴得到答案

我与dependency walker进行了核实,并获得了以下信息: -在Windows 10下,某些依赖项丢失,即使它是在Win10下生成的 -在Windows7下,所有依赖项都正常

< >我尝试用另一个C++编译器从TDM GCC-64的G++中进行测试,用CygWin的一个测试:没有给出更好的结果,甚至更坏。 我还尝试将我的c#string参数作为IntPtr传递,如下所示:

IntPtr myptr = Marshal.StringToHGlobalAnsi("Hello !");
SomeFunction(myptr);
但它在Win10下也不工作,但在Win7下仍然工作


另一个测试是从我的dll中删除std::cout,最后调用是可以的,但我仍然想让它工作,因为这是在测试环境中,在生产环境中,我必须使用一个外部dll,我没有源代码。

我更新了代码,如下所示:

int DLL_EXPORT SomeFunction()
{
    return 5;
}
它起作用了。c#中所谓的非托管dll是可以的

之后,我搜索了cout,在stackoverflow中找到了一些与cout在从c#调用的非托管dll中的使用相关的主题

因此,在我再次将函数更改为以下内容后:

void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
错误再次发生

然后我决定在Trimyg的建议下解决这个问题,用VisualStudioC++(而不是TDMGC-64)来构建DLL。

用MS C++建立DLL,在Win 10下运行测试:工作:-)< /P> std::cout没问题 消息框正常 HRESULT:0x8007045A中不再有:异常


非常感谢回答问题的人。

将应用程序移动到Win10时,您没有忘记将dll复制到正确的位置,是吗?欢迎使用堆栈溢出。请花点时间阅读并参考您可以在此处询问的内容和方式。我是在Win10 64位的目标平台下进行构建的。所有内容都在同一个目录中。然后,为了在Windows7下进行测试,我复制了目录及其内容。找到了您的dll,但初始化代码失败。可能缺少依赖项(比如找不到libstdc++),所以请检查。Microsoft的事件查看器(运行eventvwr)将告诉您更多信息。转到“Windows日志”>“应用程序”并查找特定的.dll错误。这可能是缺少依赖项或并行错误。如果您在将错误事件添加到问题中时对我进行评论,我将尝试进一步提供帮助。
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}