在项目模板中包含对我自己的程序集的引用的最佳方式是啥?

Posted

技术标签:

【中文标题】在项目模板中包含对我自己的程序集的引用的最佳方式是啥?【英文标题】:What is the best way to include references to my own assemblies in a project template?在项目模板中包含对我自己的程序集的引用的最佳方式是什么? 【发布时间】:2011-03-28 16:38:28 【问题描述】:

我们已经用 C# 开发了一个库,现在我希望创建一个项目模板来帮助正确使用该库。

我希望新项目包含对库程序集的引用,但不希望必须将程序集部署到 GAC,或依赖驻留在某个特定位置的程序集。

我的想法是将 .dll 包含在项目模板 .zip 文件中。这意味着它将最终位于新项目的项目文件夹中的某个位置。也许在一个名为 Lib 的文件夹中。那么项目文件中的引用提示就可以指向那个文件夹。这是一个好主意吗?今后我可能会遇到什么问题?

是否有某种机制可以在我不知道的项目模板中包含此类第 3 方库?你是如何解决这个问题的?我肯定不是第一个。

【问题讨论】:

答案在某种程度上取决于您计划如何部署模板。你在使用 VSIX 吗?您是否使用 MSI (Windows Installer) 或其他通用部署技术?您是否打算仅分发 zip 文件并提供手动安装说明? 【参考方案1】:

过去我不得不解决这个问题。在一种情况下,它是一个安装到 GAC 的日志库,这意味着 Reference 元素只需要程序集名称。在另一种情况下,我们将库安装到文件系统,创建了一个包含该位置的注册表项(以防用户变可爱并更改了我们的安装位置)并使用project template wizard 查找注册表项并填充替换项以在引用的提示路径中具有正确的位置。 (注意:模板向导方法要求您将向导的程序集安装到 GAC,这听起来像是您试图避免...)

如果您不希望将库安装在 GAC 或特定位置,那么在项目中包含程序集的方法几乎是您唯一剩下的选择。积极的一面是,您的项目模板的部署相当简单,您不必使用 GAC、自定义向导等。消极的一面是,如果您创建了库的新修订版,您的用户将需要更新每个项目的库副本。

【讨论】:

安装到 GAC 有什么影响?避免它的原因是什么? 主要含义是安装到 GAC 的程序集副本“获胜”。也就是说,您的应用文件夹中可能有一个更新的副本,但只要强名称匹配,运行时会优先从 GAC 加载副本。一个大致类似的示例就像 GAC 程序集的路径是 PATH 变量中的第一个条目,并且您发出了 LoadLibrary 调用。当您尝试更新二进制文件时,这可能会导致奇怪的行为,而这种行为却莫名其妙地没有改变。 此外,虽然这不是直接的 GAC 问题,但使用强名称意味着您的程序集现在需要一个与其编译所针对的强名称匹配的程序集;您必须重新编译或注册将绑定重定向到较新版本的发布者策略。

以上是关于在项目模板中包含对我自己的程序集的引用的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 项目:如何仅包含一种配置的参考?

在 Vue 项目中包含或初始化 jQuery 库的最佳方法是啥?

项目添加程序集的引用后老是报错

RTL基本知识:如何正确在敏感信号列表中包含function中的信号

在 Swift 中存储和引用绘图数据以在 UITableView 中使用的最佳方式

Azure Functions:引用程序集的配置文件