V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noli
V2EX  ›  C

如何在 vs2008 的 C++ 项目中动态加载和运行 CIL Assembly

  •  
  •   noli · 2016-10-11 09:51:53 +08:00 · 1884 次点击
    这是一个创建于 2969 天前的主题,其中的信息可能已经有所发展或是发生改变。
    具体是这样的,我需要在 vs2008 的环境中写 dll ;我希望可以在这个 dll 中加载和运行 CIL assembly 。

    由于目标的运行环境虽然都是 windows 但不一定都有 .net 运行时,于是选用了 mono 来做静态链接;但是直接编译 mono 生成的 lib 是依赖比 vs2008 高版本的 CRT 的,所以和 dll 源码 link 到一起的时候,会有各种 linker error 。

    我目前的想法是,不管 dll 的生成环境用的是什么版本的 CRT ,只需要把整个 mono lib 作为一个整体(现在 mono 编译出来是多个 lib 文件),链接到所需要的 CRT 版本,然后在生成 dll 的时候在链接到一起。

    这个想法可行么?
    12 条回复    2016-10-12 23:12:10 +08:00
    Karblue
        1
    Karblue  
       2016-10-11 10:05:28 +08:00
    那么问题来了。为什么不直接用 mono 呢
    noli
        2
    noli  
    OP
       2016-10-11 12:01:55 +08:00
    @Karblue 好问题,如果要写一个 dll 而不是 exe ,如何直接用 mono 呢?
    alqaz
        3
    alqaz  
       2016-10-11 12:36:52 +08:00 via Android
    没怎么看明白意思,意思是你想在 c++代码中调用.net 模块功能但是目标机器上可能没有.net clr?
    noli
        4
    noli  
    OP
       2016-10-11 13:22:02 +08:00
    @alqaz 正确。本质上来说是希望把 mono 当作一个脚本引擎。但问题是, mono 的 windows build 只支持 vs2013 或以上的版本,因此强行连接 vs2008 生成的 dll 会发现一大堆 CRT 的方法找不到导致失败。
    Karblue
        5
    Karblue  
       2016-10-11 17:05:05 +08:00
    @noli 就不能拿个 exe 载入吗。。
    alqaz
        6
    alqaz  
       2016-10-11 18:22:03 +08:00 via Android
    @noli 只弄过.net c++,这个真不太清楚。官方不支持的东西,如果总在产品上,能绕过去就绕过去,不然结果就不好说了。
    jeremaihloo
        7
    jeremaihloo  
       2016-10-11 23:12:14 +08:00 via Android
    只知道是可以做到让.net 的程序经过处理,脱离.net 运行时和 mono 运行时的,而且程序体积大大变小
    enenaaa
        8
    enenaaa  
       2016-10-12 14:20:41 +08:00
    可以加一个代理的 dll B , 用合适的 vs 版本编写,在里面包含 mono lib 。以动态库的形式单独编译,并且导出 C 语言格式的符号。
    vs2008 写的 dll A , 通过 B 来间接调用 mono lib 的功能。
    C 格式的符号各版本通用,可以解决这种链接错误。
    Tianqi
        9
    Tianqi  
       2016-10-12 14:35:06 +08:00 via iPhone
    @enenaaa B 能编译通过么。。
    enenaaa
        10
    enenaaa  
       2016-10-12 15:20:53 +08:00
    @Tianqi B 以动态库方式编译。 A 和 B 可以使用不同的 CRT 。
    noli
        11
    noli  
    OP
       2016-10-12 18:40:07 +08:00
    @enenaaa 正有此意,只要能隔离开两个不同的 CRT ,。但是不是只有 dll 能达到这个效果, lib 也是不可以的,是因为 lib 依然会导出所有的符号?
    enenaaa
        12
    enenaaa  
       2016-10-12 23:12:10 +08:00   ❤️ 1
    @noli 如果 B 是静态 lib , 那得和 A 放一起编译链接。 A 和 B 引用的 CRT 就会有版本冲突。
    静态库要编译进宿主可执行文件,动态库是单独编译的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:01 · PVG 18:01 · LAX 02:01 · JFK 05:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.