如何创建可被Microsoft Access调用的.NET Assembly?相关报错如何解决
问题1:.NET程序集(包括自定义程序集和引用的程序集)需要放在什么位置,VBA才能找到所有所需的DLL?
有两种通用可行的存放方案:
- 和调用它的Access数据库(.accdb/.mdb)存放在同一目录
- 注册到全局程序集缓存(GAC)
如果使用regasm注册时未携带/codebase参数,CLR会优先在GAC查找程序集,再在程序集探测路径(包括Access.exe宿主进程所在目录、当前工作目录、配置文件指定路径等)查找。最稳妥的方案是注册时添加/codebase参数指定程序集的完整绝对路径,或者直接将程序集和Access数据库放在同一目录。
问题2:我是否需要修改开发设备的搜索路径,才能让Access VBA找到对应DLL?
不需要额外修改系统搜索路径。要么按照上一条的路径要求放置程序集,要么在使用regasm注册时携带/codebase参数,直接将程序集的实际路径写入注册表,COM激活时会直接读取该路径加载程序集。
问题3:是否存在Copy Local选项开启后仍未包含的Microsoft程序集依赖项?
存在。属于.NET Framework基类库的官方程序集默认不会复制到输出目录,这类程序集默认已在GAC中部署,Copy Local配置对GAC中默认存在的框架程序集不生效。
问题4:我是否应该使用Fusion Log Viewer (fuslogvw.exe)排查是否缺少依赖程序集?
应该。该工具可以完整记录CLR加载程序集的全流程,包括查找路径、加载失败的具体原因,是排查.NET程序集加载失败问题的首选工具,你当前的排查方向正确。
问题5:能否推荐讲解构建可供VBA调用的类库的参考资料或第三方书籍?
可参考的资料包括:
- 微软.NET Framework官方文档中「向COM公开.NET组件」相关章节
- 《CLR via C#》中COM互操作相关章节
- 《Microsoft .NET Interoperability》
以上资料对COM互操作的底层逻辑和实操步骤有完整讲解。
问题6:如果是CLR无法识别所有依赖项的问题,如何让GAC和所有依赖项对CLR可见?
可通过以下方式处理:
- 确保目标设备已安装对应版本的.NET Framework(你的场景下为.NET Framework 4.7.2或4.8),默认安装完成后所有框架基类库都会在GAC中注册,CLR可直接识别
- 自定义依赖程序集如果不想和主程序集同目录存放,可以使用
gacutil.exe注册到GAC,注册后CLR全局可见 - 可在程序集配置文件中指定
<codeBase>节点手动配置依赖项的查找路径
问题7:若要让VBA识别程序集和GAC,还需要执行哪些额外步骤?
除了你已经完成的COM可见标记、regasm注册之外,还需要注意:
- 若使用64位Access,必须使用对应64位版本的
regasm(默认路径为C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe)注册;32位Access则使用32位版本的regasm(默认路径为C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe),位数不匹配会出现注册成功但VBA无法创建对象的问题 - 如果程序集不放在GAC,注册时必须添加
/codebase参数 - 程序集需要强名称签名才能注册到GAC
问题8:我是否需要为C#程序集创建DLL入口点?
不需要。COM互操作场景下不需要显式声明DLL入口点,CLR会处理COM激活的相关逻辑,你当前的代码结构已经满足要求。
问题9:我是否需要尝试其他版本的Microsoft Access?
不需要优先尝试更换版本,先排查位数匹配、注册参数、依赖项三类问题,90%以上的同类问题都是以上三类原因导致的,和Access版本关联度极低。
问题10:该程序可以在一台工作站上正常运行,但在另一台上报429错误,是否大概率是依赖项问题?
大概率为依赖或注册相关问题,常见场景包括:
- 目标设备未安装对应版本的.NET Framework
regasm注册时位数不匹配- 程序集未正确注册,或注册时未加
/codebase参数且程序集路径不在探测路径中 - 目标设备的GAC中缺少框架相关的依赖项
内容的提问来源于stack exchange,提问作者Doug Kimzey
相关产品推荐
相关产品推荐

