我的解决方案主要是C语言,但是我有一个C++项目,它创建了我的C代码调用的DLL。布局如下:
[已编辑:有两个级别的间接寻址,这会导致问题]
我们将此解决方案称为MySolution。它有四个项目:
MySolution
MyCppDll (creates an unmanaged DLL)
MyCSharpWrapper (Managed wrapper for the unmanaged DLL)
MyCSharpLibrary (Contains classes that access the wrapper)
MyCSharpProgram (Creates classes from MyCSharpLibrary)
我已正确设置了依赖项,以便首先编译MyCppDll,然后编译包装器、库和程序。但是,在IDE中构建时,MyCppDll的输出不会复制到MyCSharpLibrary的输出目录。
我可以通过为MyCSharpLibrary创建一个构建后步骤,将MyCppDll.dll复制到MyCSharpLibrary\bin\Debug(或\Release)目录来解决这个问题。
但在编译MyCSharpProgram时,它会获取与包装器和库关联的文件,但不会获取DLL。同样,我可以创建一个构建后步骤来完成它,但这并不理想,原因有两个。
真正的解决方案有几十个项目,其中许多引用了MyCSharpLibrary。正如您可以想象的那样,为每一步创建后期构建步骤都是令人厌烦且容易出错的。每次我添加引用该程序集的新项目时,我都必须创建另一个后期构建步骤。
这应该是没有必要的。当我从命令行构建该解决方案时,DLL将按预期从MyCSharpLibrary目录复制。也就是说,从IDE生成的目录MyCSharpProgram\bin\Debug包含MyCSharpProgram.exe、MyCSharpLibrary.dll、MyCSharpWrapper.dll(以及相关的.pdb文件)。但是,如果我从命令行生成(使用MSBuild),目录将包含所有这些内容和MyCppDll.dll。
[编辑-问题似乎是,除非有从程序项目到包装器项目的直接引用,否则不会复制文件。也就是说,如果我在MyCSharpProgram项目中添加对MyCSharpWrapper的引用,则会复制DLL。同样,这只发生在IDE中。在从他使用命令行。]