- 主题:封装成Dll供C#调用
用QT creator,mingw,输出纯函数的dll,供其他软件工程师用C#调用。但总是失败,但自己用QT调用没有问题,用dll_viewer看函数名称也没问题。可能是什么原因?谢谢大家。
--
FROM 61.164.217.*
mingw65 和 msvc 没有二进制兼容。
给 c# 使用,肯定底层是 msvc 编译的对不对。
所以你最好在 qtcretaor 里面把编译器改成 msvc.
如果往深里面讲,mingw65 和 msvc 在 c 调用约定上面是二进制兼容的。但通常也会失败,因为在 mingw65 里面 malloc() 的内存,在 msvc 里面 free() 时就会崩溃。
总之,最简单的方案就是你用 msvc 就完事了。
【 在 olt 的大作中提到: 】
: 用QT creator,mingw,输出纯函数的dll,供其他软件工程师用C#调用。但总是失败,但自己用QT调用没有问题,用dll_viewer看函数名称也没问题。可能是什么原因?谢谢大家。
--
修改:hgoldfish FROM 47.243.39.*
FROM 47.243.39.*
MingW编译的东西要带上msvcrt.dll这个动态链接库,
你可以用dumpbin看一下你写的这个dll的依赖。
【 在 olt 的大作中提到: 】
: 用QT creator,mingw,输出纯函数的dll,供其他软件工程师用C#调用。但总是失败,但自己用QT调用没有问题,用dll_viewer看函数名称也没问题。可能是什么原因?谢谢大家。
--
FROM 115.183.174.*
还有这个道道,对我来说改成MSVC确实最简单。
Anyway,一些芯片自带的dll(我不知道它是怎么产生的),无论我用QT调用还是用C#调用,都ok。站在user角度,它这个dll比我qt产生的dll 友好太多了。那它是怎么做到的? 到底是C#对dll太挑食了,还是 我QT产生的dll太不标准化了。
谢谢。
【 在 hgoldfish 的大作中提到: 】
: mingw65 和 msvc 没有二进制兼容。
: 给 c# 使用,肯定底层是 msvc 编译的对不对。
: 所以你最好在 qtcretaor 里面把编译器改成 msvc.
: ...................
--
FROM 61.164.217.*
谢谢,我试试看。
同时有另外一个疑问:用QT产生exe,我可以用windeployqt.exe去导入各种dll(使用者需要但我自己不知道需要这个)。但QT产生dll,我也想用这个思路去做,但执行windeployqt失败。
是不是有其他的方法,但思路是一样的。
谢谢。
【 在 philzhang 的大作中提到: 】
: MingW编译的东西要带上msvcrt.dll这个动态链接库,
: 你可以用dumpbin看一下你写的这个dll的依赖。
:
--
FROM 61.164.217.*
就是我所说的。
第一,需要使用 c abi, 最简单的就是用 c 来写。不然就把导出的函数包在 extern "C" {} 或者严格声明使用 WINSTDAPI 类似的 ABI
第二,所有结构体都只给个 HANDLE,类似于指针,但是它的销毁,必须在我们自己的 DLL 里面做。
【 在 olt 的大作中提到: 】
: 还有这个道道,对我来说改成MSVC确实最简单。
: Anyway,一些芯片自带的dll(我不知道它是怎么产生的),无论我用QT调用还是用C#调用,都ok。站在user角度,它这个dll比我qt产生的dll 友好太多了。那它是怎么做到的? 到底是C#对dll太挑食了,还是 我QT产生的dll太不标准化了。
: 谢谢。
: ...................
--
FROM 120.41.25.*
你说的这个不熟
- 来自 水木社区APP v3.5.7
【 在 olt 的大作中提到: 】
: 谢谢,我试试看。
:
: 同时有另外一个疑问:用QT产生exe,我可以用windeployqt.exe去导入各种dll(使用者需要但我自己不知道需要这个)。但QT产生dll,我也想用这个思路去做,但执行windeployqt失败。
:
: 是不是有其他的方法,但思路是一样的。
:
: 谢谢。
--
FROM 223.104.42.*