- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
作为序言,我已经使用 C# 工作了几个月,但我完全不熟悉部署和程序集等概念。我的问题很多而且各不相同,尽管我正在疯狂地谷歌搜索和阅读它们无济于事(我目前有 Pro C# 2008 和 .NET 3.5 平台在我面前)。
我们有这个流程,它由三个组件组成:引擎、过滤器和流程逻辑。我们非常喜欢这个过程,希望在其他项目中重用它。所以现在我开始探索一个解决方案、一个项目之外的空间。
这听起来正确吗?一个巨大的解决方案:
引擎是所有进程的共享代码,所以我假设它可以是一个共享程序集?如果共享程序集与使用它的项目位于同一解决方案中,如果它应该在 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/
C#内部访问修饰符的定义是内部:只能在包含程序集或友元程序集内访问。所以我的问题是什么是 C# 程序集?在包含程序集或 friend 程序集之内是什么意思?它是否意味着在同一个命名空间或项目中? 最佳
任何人都可以回答以下问题。我正在使用 c# 语言。 我可以将程序集调用为 .ddl 或 .exe 文件吗? 我可以将 Assembly Manifest 称为程序集吗? 程序集、元数据和程序集 lis
我正在从 Python 运行一个 .NET COM 程序集,只有当我将程序集 dll 和依赖项复制到我的 Python 根路径 c:\Python27 时才能使它正常工作。 这是不整洁的,所以我想将
作为世界上任何一名程序员,他/她一生中至少有一次,我正在尝试创建我的“革命性”,新的且唯一的操作系统。 :D 好吧,我正在使用虚拟模拟器(Oracle VM Virtual Box),为此我创建了一个
我创建了以下程序来读取 5 个数字,然后 dumpreg查看输入的数字... INCLUDE Irvine32.inc .data count = 5 scor
如何在保护模式下执行 IN 和 OUT 等受限指令? 我发现它需要足够高的特权级别(CPL)才能执行 IO 指令。我怎样才能在内核模式下运行,拥有 IO 权限或任何其他可能对我有帮助的东西? - 我希
目录 C# 程序集、模块和类型概念及关系 概述 程序集 模块 类型 程序集、模块和类型的关系 总结 引用
构建 maven assembly ,我留下了这样的东西: ${project.basedir} / LICENS
我的应用程序由几个核心程序集和几个扩展/插件程序集组成。为了让 MEF 知道插件必须提供的所有部件,即使我永远不会使用它们的任何部件,我也必须加载这些程序集。这使得应用程序需要更多时间来启动(如果我要
我对我们的构建基础结构有一个非常具体的要求,即将另一个 JAR 依赖项的一些内容复制到我的 Web 应用程序的特定子文件夹中。我们正在使用 maven-assembly-plugin,一个自然的方法是
为什么下面的指令会设置符号标志? mov al,0FEh sub al,2 据我了解,AL寄存器可以保存2^8 - 1或255。0FEh = 254(十进制)。减去 2 叶 252。这似乎是正数。 (
我以前使用过 NUnit,但已经有一段时间了,而且从来没有在这台机器上使用过。我在 Program Files 下解压了 2.4.8 版本,并且在尝试加载测试时不断收到此错误。 Could not l
我说的是一个使用 C# 进行游戏编程的小型游戏引擎。所以,我有一个嵌入单声道运行时的 C++ 应用程序(我称之为“启动器”)。我有一个用 C# 编写的程序集,它是我的游戏引擎类库。启动器按照 Embe
我对汇编相当陌生,并尝试从标准输入读取值(从 C 调用 scanf 函数)并将其打印回标准输出(使用 printf)。 .text readstr: .asciz "%d" #strin
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我正在开发一个汇编程序,该程序将整个文本文件读入缓冲区,然后将其显示在控制台中。它立即显示 24 行(每行的最大长度为 80,因为我使用 80 宽 * 25 高的 dossbox )然后等待用户输入,
我正在使用一个简单的程序集片段,使用 BIOS 作为引导加载程序的一部分将字符打印到屏幕上。这是引导加载程序代码。 [org 0x7c00] [bits 16] %include "a20_check
我只是想知道这段代码是什么意思: XOR EAX,EBX XOR EBX,EAX XOR EAX,EBX 最佳答案 那是 xor swapping . 在寄存器上执行它不会遇到常见的难看的失败案例。
我在新电脑上的 XNA 项目开始出现奇怪的错误。我有两个关于解决方案的项目和一个由它们使用的库。其中一个项目,一个 XNA 游戏项目,运行完美。另一个项目是 WindowsForm 和 XNA 的混合
是的,我正在努力实现类似的目标 __asm__(jmp label;); 其中 label 应替换为内存中保存的字符串值(结构体的字段)。 有没有办法做到这一点(或类似的方法可以让我跳转到运行时确定的
我是一名优秀的程序员,十分优秀!