.NET 5 WinForms应用如何不区分版本调用32/64位非托管DLL扫描VST插件
单版本.NET 5 WinForms程序同时支持32/64位VST插件扫描的实现方案
由于同一进程无法同时加载32位和64位的非托管模块,所有可行方案的核心逻辑都是跨进程调用,以下是3种可落地的实现路径:
方案1:自研对应位宽的独立扫描子进程(最推荐)
- 主程序编译为
Any CPU配置,无需绑定固定位宽 - 额外开发两个轻量的扫描辅助程序,分别编译为32位、64位,各自负责调用对应位宽的stub DLL加载VST插件、读取元数据
- 将32位stub、32位辅助程序打包到程序根目录的
x86子文件夹,64位资源对应放到x64子文件夹 - 主程序扫描时按需启动对应位宽的子进程,通过匿名管道、命名管道或者标准输入输出传递扫描路径、返回扫描结果,扫描完成后子进程自动退出
- 优势:实现逻辑简单、调试成本低,子进程加载异常插件崩溃不会影响主程序稳定性,对用户环境无额外依赖
方案2:基于COM代理实现跨位宽调用
- 将你的stub DLL封装为标准COM组件,注册到系统后,不同位宽的进程可以通过COM互操作跨位宽调用,系统会自动启动对应位宽的
dllhost.exe作为代理进程完成调用 - 优势:不需要自行开发维护子进程通信逻辑
- 劣势:需要处理COM组件注册逻辑,对终端用户环境有要求,调试难度高于方案1
方案3:基于开源跨位宽调用封装库实现
- 可以直接使用针对Any CPU P/Invoke场景的开源封装库,这类库的底层原理也是自动创建对应位宽的子进程完成非托管调用,不需要自行实现子进程通信逻辑
- 仅需要将32位、64位stub DLL放到对应位宽的资源目录,配置好调用映射即可
通用注意事项:
- 所有扫描逻辑必须添加完整的异常捕获,避免加载损坏的VST插件导致进程崩溃
- 发布时需要确认所有非托管DLL、子进程程序的打包路径正确,避免运行时找不到文件
- 如果你使用.NET 5的单文件发布,需要将非托管DLL、子进程程序设置为随包发布不内嵌,或者配置正确的运行时提取路径
内容的提问来源于stack exchange,提问作者demberto
相关产品推荐
相关产品推荐

