【发布时间】:2019-07-23 08:07:30
【问题描述】:
这个话题当然看起来并不“新”,但是在阅读了许多帖子、博客和 cmets 之后,我仍然没有更聪明,并且无法让我的测试应用程序正常工作。
从实现的角度来看,我必须用 mingW 编译 dll(当使用其他 MSVC 编译器时,错误计数很大)。但是,这会在调用 c# VS2017 时出现错误:
System.BadImageFormatException: '试图加载格式不正确的程序。 (来自 HRESULT 的异常:0x8007000B)'
而 示例 DLL 在使用 MSVC2107-64 位编译时在 Visual Studio 项目中工作正常(但如果尝试使用相同的编译器编译 现有实现 会产生 120 多个错误) .
我的 DLL 导出示例代码很简单(在 Qt 中):
//qtLib.h
#pragma once
extern "C"
{
__declspec(dllexport) int __stdcall test();
}
//qtLib.cpp
#include "qtlib.h"
int __stdcall test()
{
return 10;
}
导出这个并用Dependency Walker查看函数名时,函数名是:
然后尝试在VS2017(C#)中调用DLL:
[DllImport("QtLib.dll", EntryPoint = "test@0", CallingConvention = CallingConvention.StdCall)]
static extern int test();
public void testFunc()
{
int val = test();
}
- “允许不安全代码”也在项目属性下打勾
当我在 MSVC 中编译完整的实现代码而不是 mingW(在 Qt 中)时,我得到的错误类型是:
__attribute__: 未知覆盖说明符
deprecated: 未声明的标识符
DISTANCE_OVERFLOW: 无法使用带括号的初始化程序初始化数据成员
DJI::OSDK::ErrorCode::MissionACK::WayPoint::DISTANCE_OVERFLOW:具有类内初始化程序的静态数据成员必须具有非易失性 const 整数类型或指定为inline类型是
const uint8_t &
所以我不知道哪个“更好”...尝试在 VS2017 (MSVC) 中读取 mingW DLL,或者尝试将实现代码转换为能够在 MSVC 中编译 DLL(非常繁琐)?有没有“快速修复”?...拜托?
【问题讨论】:
-
您的术语似乎存在重大问题,这无助于您找到正确的搜索字词。 MSVC 是 Microsoft Visual C++ 编译器的常用缩写。这不是 C#。我什至不知道“在 VS2017 中读取 mingW DLL”是什么意思。你为什么要把 Qt 混在一起呢?这使情况变得更糟。通常,除非您对两种技术都相当流利,否则不应混合使用两种技术。您正在尝试混合 3(C#、C++、Qt)。
-
hmm 抱歉,我不这么认为...我正在 Qt 中编译 dll(不是通过 Visual Studio 中的 Qt VS 工具),使用 mingW 和 MSVC 编译器编译 DLL(从 C++ 代码创建 DLL)。并通过 Visual Studio 中用 C# 编写的示例应用程序测试 dll。当使用 MSVC 编译 dll 时,它可以在 C# 应用程序中工作(出于明显的原因),但在使用 mingW 编译器编译时则不行......
-
这说明了很多。并且您已经检查了 MingW DLL 是否像 MSVC 构建一样是 x64 的?因为这是
0x8007000B的最常见原因。至于DISTANCE_OVERFLOW的问题;我们看不到代码。我建议就该部分提出一个新问题只是。
标签: c# c++ visual-c++ mingw dji-sdk