Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使程序集内部构件在运行时对另一个程序集可见_C#_Runtime Compilation - Fatal编程技术网

C# 使程序集内部构件在运行时对另一个程序集可见

C# 使程序集内部构件在运行时对另一个程序集可见,c#,runtime-compilation,C#,Runtime Compilation,所以我一直在寻找一种方法来做这件事,每次我发现一些东西,它会导致一个不同的问题 基本上,我有一个游戏机。控制台运行C#代码片段。编译后的程序集需要是当前程序集的朋友,以便控制台了解当前程序集中的所有类型并可以对其进行操作 问题一: 每次运行console命令时,都会生成一个新的程序集(如果有人知道如何生成,我希望避免这种情况),并且为了使它成为朋友程序集,它需要与上一个程序集具有相同的名称。 很遗憾,您无法卸载以前的程序集,因此新程序集无法覆盖它。这迫使我使用AppDomains 问题二: 如果

所以我一直在寻找一种方法来做这件事,每次我发现一些东西,它会导致一个不同的问题

基本上,我有一个游戏机。控制台运行C#代码片段。编译后的程序集需要是当前程序集的朋友,以便控制台了解当前程序集中的所有类型并可以对其进行操作

问题一: 每次运行console命令时,都会生成一个新的程序集(如果有人知道如何生成,我希望避免这种情况),并且为了使它成为朋友程序集,它需要与上一个程序集具有相同的名称。 很遗憾,您无法卸载以前的程序集,因此新程序集无法覆盖它。这迫使我使用AppDomains

问题二: 如果我让每个程序集使用一个单独的AppDomain,然后卸载最后一个,它可以工作,但我无法从当前AppDomain操作对象,因为它们不是从MarshalByRef派生的,所以当我将它们作为参数传递给脚本时,它会尝试序列化它们。 我不喜欢AppDomains

因此,我认为最简单的方法是在同一AppDomain中生成具有不同名称的程序集,并在运行时以某种方式将它们设置为好友程序集

我确实意识到这可能是不可能的,所以任何其他选择都是受欢迎的

编辑:
让它更清楚。脚本需要访问主/父程序集内部。而不是相反。我无法将主程序集中的所有内容都公开,因为我希望代码可以重用。

您可以添加到新程序集。

您可以添加到新程序集。

如果您要生成这些程序集,为什么不将您想要的项公开
而不是内部

或者,将可公开类型标记为
受保护的内部
,并在生成的程序集中创建派生类(假设生成的程序集引用主程序集)。这将允许生成的程序集使用其派生类,该派生类将通过受保护的成员访问主程序集。这两项都不会使您的成员普遍“公开”

您可以使用,但这是在编译时。但是,听起来您是在从代码段动态编译程序集,因此您应该能够以任何想要的属性进行编译

我没有意识到您希望主程序集对生成的程序集可见。正如下面问题的答案所解释的,您可以影响给定实例的属性,但不能静态地影响类型


当然,生成的代码始终可以使用反射来获取类型。

如果要生成这些程序集,为什么不将所需的项设置为公共
而不是内部

或者,将可公开类型标记为
受保护的内部
,并在生成的程序集中创建派生类(假设生成的程序集引用主程序集)。这将允许生成的程序集使用其派生类,该派生类将通过受保护的成员访问主程序集。这两项都不会使您的成员普遍“公开”

您可以使用,但这是在编译时。但是,听起来您是在从代码段动态编译程序集,因此您应该能够以任何想要的属性进行编译

我没有意识到您希望主程序集对生成的程序集可见。正如下面问题的答案所解释的,您可以影响给定实例的属性,但不能静态地影响类型


当然,生成的代码总是可以使用反射来获取类型。

这似乎不可能。您只需将每个程序集的成员生成为
public
——因为程序集是动态生成的,所以这不应该是一个问题

这似乎是不可能的。您可以将每个程序集的成员生成为
public
——因为程序集是动态生成的,所以这不应该是一个问题

我正在考虑一个类似于您的问题,我正在考虑某种代理程序集,它将公共方法公开给主程序集的内部

组件:

  • 主要:内部组件和内部构件对代理组件可见
  • 代理:用公开的方法间接访问内部主体
  • 使用者:可以访问代理以修改主
在我的例子中,我的主程序集是一个可重用组件,我有两种消费者。第一种是在我的主程序集中使用可重用组件,因此只能访问主程序集的公共成员。第二个耗电元件是测试第一个提到的耗电元件组件的测试组件。此程序集通常希望模拟主程序集中的某些内部构件,因此正在使用代理访问这些内部构件


这可能是一种开销,尤其是在生成程序集时,但它可以很好地分离关注点。

我正在考虑一个类似于您的问题,我正在考虑某种代理程序集,它将公共方法公开给主程序集的内部

组件:

  • 主要:内部组件和内部构件对代理组件可见
  • 代理:用公开的方法间接访问内部主体
  • 使用者:可以访问代理以修改主
在我的例子中,我的主程序集是一个可重用组件,我有两种消费者。第一种是在我的主程序集中使用可重用组件,因此只能访问主程序集的公共成员。第二个耗电元件是测试第一个提到的耗电元件组件的测试组件。此程序集通常希望模拟主程序集中的某些内部构件