You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将GMap.net转换为COM组件?Delphi项目适配求助

在C#中将GMap.NET编译为COM组件并支持离线模式的方法

一、编译GMap.NET为COM组件的步骤

  • 先获取GMap.NET的C#源码(优先用官方源码项目,比NuGet包更方便调整COM适配)
  • 打开项目后,右键项目→属性:
    • 「应用程序」标签:勾选使程序集COM可见
    • 「生成」标签:勾选为COM互操作注册(需管理员权限运行VS)
    • 「签名」标签:勾选为程序集签名,新建一个强名称密钥文件(密码可留空)
  • 代码层面适配COM规范:
    • 给需要暴露给Delphi的类、方法、接口添加[ComVisible(true)]属性,不需要对外的成员设为[ComVisible(false)]
    • 给每个公开的接口和类手动指定GUID(VS菜单「工具→创建GUID」生成,选注册表格式),示例:
      [Guid("12345678-ABCD-EFGH-IJKL-MNOPQRSTUVWX")]
      [ComVisible(true)]
      public interface IGMapWrapper
      {
          void InitializeMap(string cachePath);
      }
      
    • 避免使用泛型集合(Delphi对泛型COM支持差),换成ArrayList或自定义的COM兼容集合类
  • 编译项目:生成后VS会自动注册COM组件,输出目录会有对应的.dll和.tlb文件
  • 手动注册(自动注册失败时):管理员身份打开CMD,执行:
    regasm /codebase /tlb:GMapCom.tlb YourGMapCom.dll
    

二、配置离线模式

  • 在COM组件的初始化方法中,设置GMap.NET的缓存模式和路径:
    [ComVisible(true)]
    public class GMapWrapper : IGMapWrapper
    {
        public void InitializeMap(string cachePath)
        {
            // 启用离线优先模式
            GMaps.Instance.Mode = AccessMode.ServerAndCache;
            // 指定离线缓存目录
            GMaps.Instance.CacheLocation = cachePath;
            // 可选:禁用网络请求,强制只用离线缓存
            // GMaps.Instance.Mode = AccessMode.CacheOnly;
        }
    }
    
  • 提前用GMap.NET自带的地图下载工具,把需要的离线地图数据下载到指定缓存目录

三、Delphi调用说明

  • 打开Delphi,选择「组件→导入组件→导入类型库」,找到生成的GMap COM类型库,生成对应的组件单元
  • 在Delphi项目中引用该单元,即可创建COM对象并调用其方法,示例:
    var
      GMapObj: IGMapWrapper;
    begin
      GMapObj := CoGMapWrapper.Create;
      GMapObj.InitializeMap('C:\GMapOfflineCache');
      // 后续调用地图相关功能
    end;
    
  • 注意使用完COM对象后,要调用GMapObj := nil释放资源

内容的提问来源于stack exchange,提问作者Robert Lo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:09