如何将外部文件与程序集关联

时间:2009-04-23 15:57:11

标签: visual-studio

假设您有一个类库项目,其中包含任何数量的补充文件,这些文件也需要包含在已编译的程序集中(例如,简单的文本文件,甚至是由程序集作为互操作层包装的传统非托管DLL)。虽然将补充文件嵌入到程序集本身relatively straightforward,但我们遇到的情况是不可能或者只是不受欢迎。我们需要将它们作为“sidecar”文件(即程序集旁边的文件,可能在相对于程序集的子目录中)

将这些文件添加到项目中并为指定的“复制到输出目录”指定适当的值似乎足以满足解决方案中完全独立的项目。但是,如果另一个解决方案中的单独项目添加了对程序集的引用,则它不会自动拾取其sidecar文件。项目中有没有办法以某种方式标记生成的程序集,以便引用程序集的任何内容都知道它需要包含相关的sidecar文件?你是怎么做到的?

8 个答案:

答案 0 :(得分:3)

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

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

N.dll是一个本机DLL ,它将在托管程序集的任何地方(包括进入GAC)。在我提供的链接上有一个非常清晰的描述。

答案 1 :(得分:1)

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

另一种选择是将sidecar文件包含在Assembly资源中,并在第一次运行时将它们解压缩到磁盘。

答案 2 :(得分:1)

如果您创建包含库及其依赖项的merge module,该怎么办?然后,您的安装人员需要参考此模块,但您将确保所有必需的文件都存在。

答案 3 :(得分:1)

我找到了一个更好的solution,这使得使用linkresource和复制引用变得非常简单。

答案 4 :(得分:0)

不幸的是,Visual Studio中似乎没有很多内置支持,虽然我可以肯定看到用例。

如果您使用Subversion作为源代码控制,那么您可以将外部引用链接为外部定义。这将引入源代码,并且您将引用必要的程序集作为项目引用而不是DLL引用,然后复制到输出目录规则将起作用。

如果不可能,另一个解决方案是在解决方案项目的前/后构建事件中包含命令,以从构建中的远程程序集中复制最新的sidecar文件。当然,这需要注意的是,当您在项目中包含DLL时,它不会自动设置;你必须采取手动步骤来设置它。

答案 5 :(得分:0)

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

您可以创建一些postbuild操作:

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

希望这有助于......:)

答案 6 :(得分:0)

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

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

我不确定您是否可以在IDE中跨解决方案使用ProjectReferences。我与MSBuild打交道很多,其中sln文件不相关,这就是我处理它的方式。

答案 7 :(得分:0)

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

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

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

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

这些只是我现在的风格,你可以创造自己的风格。