如何将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兼容集合类
- 给需要暴露给Delphi的类、方法、接口添加
- 编译项目:生成后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
相关产品推荐
相关产品推荐

