V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
noli
V2EX  ›  C

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

  •  
  •   noli · Oct 11, 2016 · 2340 views
    This topic created in 3492 days ago, the information mentioned may be changed or developed.
    具体是这样的,我需要在 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 replies    2016-10-12 23:12:10 +08:00
    Karblue
        1
    Karblue  
       Oct 11, 2016
    那么问题来了。为什么不直接用 mono 呢
    noli
        2
    noli  
    OP
       Oct 11, 2016
    @Karblue 好问题,如果要写一个 dll 而不是 exe ,如何直接用 mono 呢?
    alqaz
        3
    alqaz  
       Oct 11, 2016 via Android
    没怎么看明白意思,意思是你想在 c++代码中调用.net 模块功能但是目标机器上可能没有.net clr?
    noli
        4
    noli  
    OP
       Oct 11, 2016
    @alqaz 正确。本质上来说是希望把 mono 当作一个脚本引擎。但问题是, mono 的 windows build 只支持 vs2013 或以上的版本,因此强行连接 vs2008 生成的 dll 会发现一大堆 CRT 的方法找不到导致失败。
    Karblue
        5
    Karblue  
       Oct 11, 2016
    @noli 就不能拿个 exe 载入吗。。
    alqaz
        6
    alqaz  
       Oct 11, 2016 via Android
    @noli 只弄过.net c++,这个真不太清楚。官方不支持的东西,如果总在产品上,能绕过去就绕过去,不然结果就不好说了。
    jeremaihloo
        7
    jeremaihloo  
       Oct 11, 2016 via Android
    只知道是可以做到让.net 的程序经过处理,脱离.net 运行时和 mono 运行时的,而且程序体积大大变小
    enenaaa
        8
    enenaaa  
       Oct 12, 2016
    可以加一个代理的 dll B , 用合适的 vs 版本编写,在里面包含 mono lib 。以动态库的形式单独编译,并且导出 C 语言格式的符号。
    vs2008 写的 dll A , 通过 B 来间接调用 mono lib 的功能。
    C 格式的符号各版本通用,可以解决这种链接错误。
    Tianqi
        9
    Tianqi  
       Oct 12, 2016 via iPhone
    @enenaaa B 能编译通过么。。
    enenaaa
        10
    enenaaa  
       Oct 12, 2016
    @Tianqi B 以动态库方式编译。 A 和 B 可以使用不同的 CRT 。
    noli
        11
    noli  
    OP
       Oct 12, 2016
    @enenaaa 正有此意,只要能隔离开两个不同的 CRT ,。但是不是只有 dll 能达到这个效果, lib 也是不可以的,是因为 lib 依然会导出所有的符号?
    enenaaa
        12
    enenaaa  
       Oct 12, 2016   ❤️ 1
    @noli 如果 B 是静态 lib , 那得和 A 放一起编译链接。 A 和 B 引用的 CRT 就会有版本冲突。
    静态库要编译进宿主可执行文件,动态库是单独编译的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2483 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 07:40 · PVG 15:40 · LAX 00:40 · JFK 03:40
    ♥ Do have faith in what you're doing.