我正在尝试编写一个混合模式 DLL,我们称之为“客户端”,以用它们的托管等效项替换一些非托管类。在我的个人机器上一切正常,但是当我签入源代码时,我们的构建机器不会构建项目。它无法识别我在另一个名为“Core”的 DLL 中使用的托管类。
我认为这个问题与预编译的头文件有关。原因如下:
为了使用“Core”中的类,我在“Client”项目中添加了对“Core”项目的引用。如果我删除此引用,然后在我的个人计算机上构建项目,它仍然可以工作。但是,CLR PCH 在删除引用后不会重新编译。如果我重新编译 CLR PCH,然后编译项目,它会失败并出现与构建机器上相同的错误:无法识别托管类。
在我看来,您导入的 DLL 中的托管类是在预编译头文件中定义的。我无法验证这一点,但这是我最好的猜测。有没有人对这个问题有任何见解?混合 DLL 中的项目引用是否通过将挂钩放入托管 PCH 来解决?
重现步骤
以下对我来说毫无意义:
- 获取客户端构建。
- 删除从客户端到核心的引用。编译客户端。客户端仍在构建。这不是预期的。
- 重新编译Client PCH,然后编译Client。编译客户端失败:“核心”中的类未定义。这是预期的行为。
- 添加对Core的引用,编译。由于同样的原因,编译客户端失败。这不是预期的
- 重新编译Client PCH,然后编译Client。客户端编译良好。
我从这个实验中得出的结论是,引用是通过预编译的头文件插入到项目中的,并且它的工作方式有些问题,至少在我们的构建机器上是这样。