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

2016-10-11 09:51:53 +08:00
 noli
具体是这样的,我需要在 vs2008 的环境中写 dll ;我希望可以在这个 dll 中加载和运行 CIL assembly 。

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

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

这个想法可行么?
1808 次点击
所在节点    C
12 条回复
Karblue
2016-10-11 10:05:28 +08:00
那么问题来了。为什么不直接用 mono 呢
noli
2016-10-11 12:01:55 +08:00
@Karblue 好问题,如果要写一个 dll 而不是 exe ,如何直接用 mono 呢?
alqaz
2016-10-11 12:36:52 +08:00
没怎么看明白意思,意思是你想在 c++代码中调用.net 模块功能但是目标机器上可能没有.net clr?
noli
2016-10-11 13:22:02 +08:00
@alqaz 正确。本质上来说是希望把 mono 当作一个脚本引擎。但问题是, mono 的 windows build 只支持 vs2013 或以上的版本,因此强行连接 vs2008 生成的 dll 会发现一大堆 CRT 的方法找不到导致失败。
Karblue
2016-10-11 17:05:05 +08:00
@noli 就不能拿个 exe 载入吗。。
alqaz
2016-10-11 18:22:03 +08:00
@noli 只弄过.net c++,这个真不太清楚。官方不支持的东西,如果总在产品上,能绕过去就绕过去,不然结果就不好说了。
jeremaihloo
2016-10-11 23:12:14 +08:00
只知道是可以做到让.net 的程序经过处理,脱离.net 运行时和 mono 运行时的,而且程序体积大大变小
enenaaa
2016-10-12 14:20:41 +08:00
可以加一个代理的 dll B , 用合适的 vs 版本编写,在里面包含 mono lib 。以动态库的形式单独编译,并且导出 C 语言格式的符号。
vs2008 写的 dll A , 通过 B 来间接调用 mono lib 的功能。
C 格式的符号各版本通用,可以解决这种链接错误。
Tianqi
2016-10-12 14:35:06 +08:00
@enenaaa B 能编译通过么。。
enenaaa
2016-10-12 15:20:53 +08:00
@Tianqi B 以动态库方式编译。 A 和 B 可以使用不同的 CRT 。
noli
2016-10-12 18:40:07 +08:00
@enenaaa 正有此意,只要能隔离开两个不同的 CRT ,。但是不是只有 dll 能达到这个效果, lib 也是不可以的,是因为 lib 依然会导出所有的符号?
enenaaa
2016-10-12 23:12:10 +08:00
@noli 如果 B 是静态 lib , 那得和 A 放一起编译链接。 A 和 B 引用的 CRT 就会有版本冲突。
静态库要编译进宿主可执行文件,动态库是单独编译的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/311799

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX