C# 有没有办法在SHFB中导入外部项目或主题文件?

C# 有没有办法在SHFB中导入外部项目或主题文件?,c#,chm,sandcastle,shfb,C#,Chm,Sandcastle,Shfb,我想生成一些单独的输出CHM文件(对于单独的库,因此我为每个库都有一个单独的shfbproj),但它们有许多共同的概念主题 我希望能够将这些主题的.aml文件放在一个地方,然后将它们导入到每个项目中,以避免重复 理想情况下,我希望在这个中心位置也有一个公共的.content文件,并将其作为“real”项目的.content文件中特定父主题节点的子项导入,以避免重复 有没有办法做到这一点?尝试将现有文件添加到项目会导致创建文件副本,或者如果手动编辑以指向项目文件夹外的文件,则会使项目不可加载 (我

我想生成一些单独的输出CHM文件(对于单独的库,因此我为每个库都有一个单独的
shfbproj
),但它们有许多共同的概念主题

我希望能够将这些主题的
.aml
文件放在一个地方,然后将它们导入到每个项目中,以避免重复

理想情况下,我希望在这个中心位置也有一个公共的
.content
文件,并将其作为“real”项目的
.content
文件中特定父主题节点的子项导入,以避免重复

有没有办法做到这一点?尝试将现有文件添加到项目会导致创建文件副本,或者如果手动编辑以指向项目文件夹外的文件,则会使项目不可加载


(我还尝试为公共内容制作一个
shfbproj
,然后在“real”项目中引用它,但这似乎没有效果。)

解决方案在很大程度上取决于您的需求和生成的帮助文件的预期结构。使用VisualStudio加载项和独立的Sandcastle帮助文件生成器(SHFB)GUI是不同的

正如您在CHM屏幕截图中看到的,在我的BMI类文档上方有一个术语表主题。此主题不在项目中,但在另一个目录中

帮助文件生成器项目也支持链接项。链接项是显示在当前项目文件夹结构中但实际位于当前项目文件夹结构之外位置的文件。例如,在多个项目之间共享令牌文件。如果在一个项目中编辑该文件,则在生成这些项目时,这些更改将反映在该文件作为链接项或实际项的其他项目中

链接项可以按常规方式在Visual Studio中添加。选择要添加现有项的选项,然后在“文件选择”对话框中,单击其上的下拉箭头,而不是单击“添加”按钮,然后选择“添加为链接”选项(如下所示)

我认为这是一个为您的附加内容的可能性

下一步,您需要双击文件,例如
ContentLayout.content
并手动编辑结构

引用自Sandcastle帮助文件生成器文档的其他信息:

如果没有Visual Studio,创建链接项的唯一方法是在文本编辑器中手动编辑项目。为此,请将生成项添加到项组。这是通过添加一个以构建操作命名的元素(即令牌文件的令牌)来完成的。Include属性指向文件的相对路径,该路径通常位于当前项目的文件夹结构之外。添加嵌套在生成项中的链接元素,并将其属性值设置为当前帮助文件生成器项目中该项的相对路径。例如:

<Tokens Include="..\SomeOtherProject\Tokens\SharedTokensFile.tokens">
  <Link>Tokens\SharedTokens.tokens</Link>
</Tokens>

令牌\SharedTokens.Tokens
上面的示例创建了一个链接的令牌文件。它的物理位置比另一个项目文件夹(..\SomeOtherProject\Tokens)中的帮助文件生成器项目文件夹高一级。其在当前项目中的虚拟位置将位于名为。\Tokens的文件夹中


链接的项目将具有删除选项,而不是删除选项。这会将它们从项目中删除,但会将它们保留在原始位置的磁盘上,因为它们可能属于另一个项目。

好的,有几个技巧可以让它按需要工作;感谢您在
链接
元素上的灵感

首先,在common docs文件夹中,创建
CommonDoc.targets

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <ItemGroup>
        <Folder Include="common\" />
    </ItemGroup>
    <ItemGroup>
        <ContentLayout Include="$(CommonContentDir)100-common.content">
            <Link>common\100-common.content</Link>
        </ContentLayout>
    </ItemGroup>
    <ItemGroup>
        <None Include="$(CommonContentDir)performance.aml">
            <Link>common\performance.aml</Link>
        </None>
        <None Include="$(CommonContentDir)security.aml">
            <Link>common\security.aml</Link>
        </None>
    </ItemGroup>
</Project>
这是从带有shfbproj的文件夹到common docs文件夹的相对路径

在现有的
Import
元素上方添加以下内容:

<Import Project="$(CommonContentDir)CommonDoc.targets" />

最后(您可以在GUI中执行这一部分),将现有的
.content
文件拆分为多个文件,以便在公共内容之前显示的任何内容都使用小于100的数字命名,然后使用大于100的数字命名。(显然,多个内容文件在合并前按字母顺序排序。)

(如果大多数内容通常会添加到普通内容之前,则可以对普通内容使用不同的数字,但对于我的情况,情况正好相反。)


CommonContentDir
属性有点烦人;我想使用
$(MSBuildThisProjectDir)
,但SHFB构建似乎无法识别这一点,而是尝试在主shfbproj文件夹中查找文件


此方法的另一个缺点是,当您想向公共主题添加新文件时,必须手动编辑
CommonDoc.targets
文件。但一旦这样做,它将自动出现在引用该文件的每个帮助文件中,而无需单独更新每个shfbproj。

是否可以这样导入整个.content子树?因此,可以在一个位置添加新项目,而无需手动更新使用它的每个项目?@Miral您是否使用我的示例中所示的Visual Studio或/和SHFB GUI?目前我使用的是独立SHFB 2017.1.28.0。
<Import Project="$(CommonContentDir)CommonDoc.targets" />