gpt4 book ai didi

c# - 如何使用共享程序集和项目?

转载 作者:太空狗 更新时间:2023-10-29 21:37:05 26 4
gpt4 key购买 nike

作为序言,我已经使用 C# 工作了几个月,但我完全不熟悉部署和程序集等概念。我的问题很多而且各不相同,尽管我正在疯狂地谷歌搜索和阅读它们无济于事(我目前有 Pro C# 2008 和 .NET 3.5 平台在我面前)。

我们有这个流程,它由三个组件组成:引擎、过滤器和流程逻辑。我们非常喜欢这个过程,希望在其他项目中重用它。所以现在我开始探索一个解决方案、一个项目之外的空间。

这听起来正确吗?一个巨大的解决方案:

  • 进程A,exe
  • 进程B,exe
  • 进程C,exe
  • 过滤器,dll
  • 引擎,dll

引擎是所有进程的共享代码,所以我假设它可以是一个共享程序集?如果共享程序集与使用它的项目位于同一解决方案中,如果它应该在 GAC 中,它如何被使用?我读过一些关于后期构建事件的内容。这是否意味着必须在每次构建时重新部署 engine.dll?

此外,我们将过滤器与进程分离(只有一个进程使用它)的主要原因是我们可以独立于进程部署过滤器,这样进程可执行文件就不需要更新。不管这是否是最佳实践,让我们顺其自然吧。这可能吗?我读过程序集链接到其他程序集的特定版本,所以如果我只更新 DLL,它实际上被认为是篡改。如何在不更改 EXE 的情况下更新 DLL?这是发布商政策的目的吗?

顺便问一下,这些东西是 Google 支持的还是 Amazon 支持的?我应该寻找什么?我看过很多关于 C# 和 .NET 的书籍,但没有一本是关于部署、构建、测试或与语言本身无关的东西。

最佳答案

我同意 Aequitarum 的分析。补充几点:

The engine is shared code for all of the processes, so I'm assuming that can be a shared assembly?

这似乎是合理的。

If a shared assembly is in the same solution as a project that consumes it, how does it get consumed if it's supposed to be in the GAC?

魔法。

好吧,这不是魔法。假设在您的解决方案中,您的流程项目 引用了引擎项目。构建解决方案时,您将生成一个项目程序集,该项目引用了引擎程序集。 Visual Studio 然后将各种文件复制到正确的目录中。当您执行流程程序集时,运行时加载程序知道在当前目录中查找引擎程序集。如果在那里找不到它,它会在全局程序集缓存中查找。 (这是加载策略的高度简化 View ;真正的策略比这复杂得多。)

GAC 中的内容应该是真正的全局代码;您有理由期望大量不同项目使用的代码。

Does that mean the engine.dll has to be reployed on every build?

我不确定您所说的“重新部署”是什么意思。就像我说的,如果您有项目到项目的引用,构建系统会自动将文件复制到正确的位置。

the principle reason we separated the filter from the process (only one process uses it) is so that we can deploy the filter independently from the process so that the process executable doesn't need to be updated

我怀疑这是否真的有值(value)。场景一:没有过滤器程序集,所有过滤器代码都在 project.exe 中。您希望更新过滤器代码;你更新 project.exe。场景二:filter.dll、project.exe。您希望更新过滤器代码;你更新 filter.dll。方案二比方案一便宜或容易吗?在这两种情况下,您都在更新文件;为什么文件名很重要?

但是,对于您的特定场景,它也许真的更便宜、更容易。了解程序集的关键是程序集是可独立版本化和可重新分发的代码的最小单元。如果您有两个东西并且将它们彼此独立地进行版本控制和发布是有意义的,那么它们应该在不同的程序集中;如果这样做没有意义,那么它们应该在同一个程序集中。

I've read that assemblies link to specific versions of other assemblies, so if I update the DLL only, it's actually considered tampering. How can I update the DLL without changing the EXE? Is that what a publisher policy is for?

程序集可以被赋予一个“强名称”。当您将程序集命名为 Foo.DLL,并编写 Bar.EXE 以说明“Bar.EXE 依赖于 Foo.DLL”时,运行时将加载恰好命名为 Foo.DLL 的所有内容;文件名不强。如果一个邪恶的黑客将他们自己的 Foo.DLL 版本安装到客户端机器上,加载程序就会加载它。强名称让 Bar.EXE 说“Bar Corporation 编写的 Bar.exe 版本 1.2 依赖于 Foo Corporation 编写的 Foo.DLL 版本 1.4”,并且所有验证都是针对与 Foo Corp 和 Bar Corp 关联的加密强 key 完成的。

是的,可以将程序集配置为仅绑定(bind)来自特定公司的特定版本,以防止篡改。要更新程序集以使用较新版本,您可以做的是创建一个小 XML 文件,告诉加载程序“你知道我是怎么说我想要 Foo.DLL v1.4 的吗?好吧,实际上如果 1.5 可用,就可以使用那也是。”

What should I look for? I see lots of books about C# and .NET, but none about deployment or building or testing or things not related to the language itself.

部署在书中经常被忽略,我同意。

如果您对托管 Windows 应用程序的部署感兴趣,我将从搜索“ClickOnce”开始。

关于c# - 如何使用共享程序集和项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2102545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com