整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

SuperMap iObjects .NET加载dl

SuperMap iObjects .NET加载dll动态库失败,控件不能用问题解析

次部署使用SuperMap iObjects .NET的开发人员,可能遇到以下问题:

1.环境部署不成功

2.部署成功了,VS工具箱里面没有SuperMap相关控件

3.工具箱里面的SuperMap相关控件拖到界面上报错

4.运行程序,报错未能加载文件或程序集

下面我们将对上述问题来使用“套路”一一解决。

大前提: 很多用户喜欢在工具箱里面拖控件使用,可视化的管理控件的属性,但遇到了上面所述
的问题不知道如何解决,这里我们先说一个“大前提”,要想使用工具箱里面的控件,无论你的计
算机操作系统是32位的还是64位的,只能部署SuperMap iObjects .NET 32位的开发环境(VS的
限制,超图也很无奈啊),这样才能注册工具箱。当然,不需要通过拖控件,习惯new控件来使用
的用户,你的计算机操作系统是32位的就安装32位的SuperMap iObjects .NET,你的计算机操作
系统是64位的,那么部署SuperMap iObjects .NET 32位还是64位的运行环境就任君选择了。

一.环境部署不成功

使用Install_x86.bat/Install_x64.bat 文件来完全部署的用户,如果部署过程中出现问题,解决的套路很简单。

1.关闭所有杀毒软件(最好连防火墙都关了)

2.关闭VS(可能会涉及到安装Microsoft .NET Framework 4.0)

3.以管理员身份运行Install_x86.bat/Install_x64.bat 文件

自定义部署不成功的用户,上面的套路照样可用,但通常出现问题是在注册工具箱的时候,我们在“大前提”里面说过,要使用工具箱来拖控件,就只能部署SuperMap iObjects .NET 32位的运行环境!所以注册工具箱的环境,要是32位的。当然,不需要注册工具箱的用户,这一点就可以不用关注。

二.部署成功了,VS工具箱里面没有控件

1.工具箱右键---->添加选项卡


2.右键新建的选项卡------>选择项

3.在新打开的页面中选择.NET Framework组件,点击浏览,找到SuperMap iObjects .NET 目录下32位bin包(x86)的SuperMap.UI.Controls.dll,SuperMap.Mapping.dll,SuperMap.Layout.dll,SuperMap.Realspace.dll,SuperMap.Data.dll,添加后点击确定。

4.此时看看我们的工具箱,是不是就有了相关控件了

三.工具箱里面的控件拖到界面上报错

这个问题的解决办法是把SuperMap iObjects .NET 目录下32位的Bin包路径加在环境变量中
具体操作如下:
1.打开计算机

2.点击系统属性

3.点击高级系统设置

4.点击环境变量

5.双击系统变量中的path变量

6.然后找到SuperMap iObjects .NET组件目录下的32位bin包路径,加在系统环境变量path中(没有的话就新建一个path)

瞬间搞定问题

四.运行程序,报错未能加载文件或程序集

上面这种错误,解决办法如下:

1.把你引用的dll文件所在bin包目录添加到环境变量中,具体方法上面已经说过了。

2.确认你的许可是否有你所用到的功能模块,一般试用许可会包含所有的功能模块,而正式许可不一定包含全部的功能模块,具体检查方法如下:

(1)打开许可中心

(2)在许可状态中查看有哪些模块以及许可是否已经过期

3.如果使用的场景的功能,计算机显卡不支持的话,也会抛出这个异常。一个简单的检验办法就是打开桌面软件(SuperMap iDesktop),看三维功能是否能正常使用。

还有一种运行程序比较常见的错误是:未能加载文件或程序集 ‘SuperMap. Version=***’ 或者它的某一个依赖项。试图加载格式不正确的程序’

解决办法如下:

第一,保证编译目标平台位数和引用的dll文件动态库位数保持一致
具体操作:

1.选中工程,右键选择属性

2.选择一致的目标平台

第二,环境变量中只有一个组件bin路径,且与引用动态库路径保持一致,具体的查看和修改方法上面已经说过,这里不再赘述。

第三,把工程的工作目录和引用路径设置为引用动态库路径,这一点可以用来检测出现的问题是否跟环境变量有关。设置好了之后,程序能够运行起来,说明问题就出在环境变量上,还是不能运行起来的话,就不用纠结环境变量了,问题不在这上面,得找找其它原因。

第四,选择合适的.NET Framework框架,SuperMap iObjects .NET 6R版本,得选择.NET Framework 3.5及以下,SuperMap iObjects .NET 7C,8C版本,得选择.NET Framework 4.0及以上。

以上就是解决此类问题的“套路”,有了这些“套路”,此类问题就可以对症下药,迎刃而解了。

果以上方法都解决不了你的问题,看看以下网友给出的解决办法: 修改笔记本键盘的驱动:通过“我的电脑”打开系统属性,选择硬件标签:打开设备管理器,我们发现中文Windows XP操作系统下,默认的键盘驱动是“标准101/102键或Microsoft自然PS/2键盘”。 1. 右键点击选择更新驱动程序,会出现硬件更新向导:选择“从列表或指定位置安装(高级)”,单击“下一步”,选择“不要搜索。我要自己选择要安装的驱动程序。” 单击“下一步”,进入“选择要为此硬件安装的设备驱动程序”页去掉复选框“显示兼容硬件”前的小勾。在“标准键盘型号”栏中选择“Japanese PS/2 Keyboard (106/109 Key)”,单击“下一步”,弹出“更新驱动程序警告”,点“是”。“确认设备安装”窗口继续点“是”。 2. 完成硬件更新向导。重新启动计算机。 修改注册表:单击“开始”菜单,点“运行”,输入“regedit”,打开注册表,进入“HKEY_LOCAL_MACHINE\ SYSTEM\ControlSet001\Control\Keyboard Layouts”,里面有很多子项,通过观察我发现,以“0804”结尾的都是简体中文输入法。打开“E00E0804”,可以看到右侧子项里有“Layout File”子项,双击打开该项,将“数值数据”中的“kbdus.dll”改为“kbdjpn.dll”,“确定”即可。依此类推,可以将所有的以“0804”结尾的子项中“Layout File”全部改为“kbdjpn.dll”,具体就根据自己常用的输入法进行选择了。然后重新启动计算机就好了! 造成笔记本电脑键盘失灵的原因非常多,比较常见的就是最开始为大家介绍的那两种,另外有些电脑病毒也会破坏电脑按键,建议大家遇到笔记本电脑键盘按键失灵先对电脑进行杀毒看看,然后在再使用以上方法解决问题。


Qt 中,可以在 DLL 中创建和显示窗口。

首先,在 DLL 项目中需要添加如下的头文件和代码:

#include <QWidget>
#include <QVBoxLayout>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget* parent=nullptr)
        : QWidget(parent)
    {
        QVBoxLayout* layout=new QVBoxLayout(this);
        QLabel* label=new QLabel("Hello from DLL", this);
        layout->addWidget(label);
    }
};

上述代码定义了一个名为 MyWidget 的 QWidget 子类,并在构造函数中添加了一个垂直布局和一个标签。

然后,在 DLL 中需要添加一个新的导出函数,用于创建和显示窗口。该函数的实现如下:

#include "MyWidget.h"

void __declspec(dllexport) createAndShowWindow()
{
    QApplication app(__argc, __argv);
    MyWidget* widget=new MyWidget();
    widget->show();
    app.exec();
}

上述代码创建了一个 QApplication 对象,创建了一个 MyWidget 对象,并调用 show() 方法来显示窗口。最后调用 exec() 方法进入事件循环。

在主程序中,可以使用 QLibrary 类来加载 DLL 并调用导出函数。代码示例如下:

QLibrary lib("mydll.dll");
if (lib.load())
{
    typedef void (*Func)();
    Func createAndShowWindow=reinterpret_cast<Func>(lib.resolve("createAndShowWindow"));
    if (createAndShowWindow)
    {
        createAndShowWindow();
    }
    else
    {
        qDebug() << "Failed to resolve function";
    }
    lib.unload();
}
else
{
    qDebug() << "Failed to load DLL";
}

上述代码使用 QLibrary 类加载 DLL,然后通过 resolve() 方法获取导出函数的地址,并转换为函数指针类型。最后调用该函数即可显示窗口。

需要注意的是,在主程序中使用 QLibrary 加载 DLL 时,需要确保 DLL 文件的路径正确,并且 DLL 文件和主程序的架构一致(如都为 x64 或 x86)。

另外,因为在 DLL 中创建了 QApplication 对象,因此需要确保主程序中没有创建过 QApplication 对象,否则会发生错误。可以将主程序中的 QApplication 对象创建部分放置到 DLL 中的导出函数中。