关于Visual Studio:如何将外部文件与程序集关联

How to associate external files with an assembly

假设您有一个类库项目,该项目具有任何数量的补充文件,这些补充文件也需要包含在已编译的程序集中(例如,简单的文本文件甚至是由程序集包装为互操作层的旧版非托管DLL)。虽然将补充文件嵌入到程序集中本身是相对简单的,但是在某些情况下,这是不可能的或不希望的。我们需要将它们作为" sidecar"文件(即,与程序集并排的文件,可能位于相对于该程序集的子目录中)

将这些文件添加具有为"复制到输出目录"指定的适当值的项目到项目中,对于在解决方案中完全独立的项目来说似乎足够了。但是,如果另一个解决方案中的单独项目为该程序集添加了引用,则它不会自动提取其sidecar文件。项目中是否有办法以某种方式标记生成的程序集,以便引用该程序集的任何人也都知道它需要包括相关的sidecar文件?你怎么做到这一点?


您可以使用al.exe,但似乎也有C#编译器选项。您要使用/ linkresource C#编译器选项创建一个多文件程序集。说明在这里,但是命令与此类似:

1
csc /linkresource:N.dll /t:library A.cs

N.dll是一个本机DLL,可以随托管程序集一起去(包括到GAC中)。我在提供的链接中有非常清楚的描述。


如果创建包含库及其依赖项的合并模块怎么办?然后,您的安装程序将需要引用此模块,但是您将确保所有必需的文件都将存在。


您是否尝试过为解决方案创建设置?可以选择包含针对应用程序安装目录的sidecar文件。

另一个选择是将sidecar文件包含在Assembly资源中,并在首次运行时将其解包到磁盘。


我们在项目中所做的是将我们创建为单独的构建文件来完成所有这些工作。

在构建文件中,您可以具有用于构建主要解决方案的标签,然后添加标签以在构建后复制所需的文件。

NAnt也是您的选择,但是现在我很高兴将Rake用作构建/调试自动化。

由于无法将其集成到Visual Studio中,因此我要做的是创建一个任务(在MSBuild,NAnt或Rake中),该任务最后执行vsjitdebugger.exe,以便在调试时将其附加到Visual Studio。

这些只是我现在的样式,您也许可以创建自己的样式。


在我看来,您使用的引用类型错误。引用有两种类型:Reference和ProjectReference。引用是对特定程序集的明确引用。 ProjectReference是对另一个项目的引用(例如.csproj)。

您正在寻找的是ProjectReference。 VS和默认的MSBuild目标被设置为执行CopyLocal。如果将" sidecar"文件的CopyToOutputPath设置为true,则与此项目有关的所有ProjectReferences现在也将提取相同的文件。

我不确定是否可以在IDE中跨解决方案使用ProjectReferences。我处理了很多与sln文件无关的MSBuild,这就是我的处理方式。


我前一段时间处理了这个。这是一个普遍的问题。

您可以创建一些后构建操作:

http://www.codingday.com/execute-batch-commands-before-or-after-compilation-using-pre-build-or-post-build-events/

希望这可以帮助... :)


不幸的是,尽管我肯定能看到用例,但Visual Studio中似乎并没有很多内置支持。

如果将Subversion用于源代码管理,则可以链接外部引用作为外部定义。这将带来源代码,您将引用必要的程序集作为项目引用而不是DLL引用,然后复制到输出目录规则将起作用。

如果这不可能,则另一种解决方案是在解决方案中项目的构建前/构建后事件中包含命令,以从构建中的远程程序集复制最新的sidecar文件。当然,这带有一个警告:当您在项目中包含DLL时,它不会自动设置。您必须采取手动步骤进行设置。