1

所以我一直在寻找一种方法来做到这一点,每次我发现一些东西,都会导致不同的问题。

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

问题一:每次运行控制台命令时,都会生成一个新程序集(如果有人知道怎么做,我很乐意避免这种情况),并且要成为朋友程序集,它需要与上一个程序集具有相同的名称。不幸的是,您无法卸载以前的程序集,因此新程序集无法覆盖它。这迫使我使用 AppDomains。

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

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

我确实意识到这可能是不可能的,因此欢迎任何其他选择。

编辑:为了更清楚。脚本需要访问主/父程序集内部。不是反过来。我无法在主程序集中公开所有内容,因为我希望代码可重用。

4

4 回答 4

1

如果您正在生成这些程序集,为什么不将您想要的项目公开public而不是公开internal

或者,将可公开类型标记为protected internal并在生成的程序集中创建派生类(假设生成的程序集引用主程序集)。然后,这将允许您生成的程序集使用其派生类,并且该派生类将可以通过受保护的成员访问主程序集。这些都不会使您的成员通常“公开”。

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

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

可以在 C# 中动态添加属性吗?

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

于 2012-06-06T09:49:57.563 回答
0

您可以将InternalsVisibleToAttribute添加到新程序集。

于 2012-06-06T09:49:22.903 回答
0

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

于 2012-06-06T09:53:21.853 回答
0

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

组件:

  • Main:内部组件和内部组件对代理程序集可见;
  • Proxy:用公共方法间接访问main的内部;
  • 消费者:可以访问代理修改主。

就我而言,我的 Main 程序集是一个可重复使用的组件,我有两种消费者。第一种只是在我的 Main 中使用可重用的组件,因此只能访问 Main 程序集的公共成员。第二个消费者是测试第一个提到的消费者组件的测试组件。该程序集通常希望模拟 Main 程序集中的一些内部,因此使用代理来访问这些内部。

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

于 2013-03-21T11:05:25.420 回答