我知道在一个类上声明的访问修饰符 internal 使得它可以从同一个程序集中访问。
但是,在我的例子中,另一个程序集能够使用 Type.GetType 访问另一个程序集中的内部类,并且还能够使用 Activator.CreateInstance() 成功创建其对象。
我想知道是否真的可以在另一个程序集中使用 Type.GetType() 访问另一个程序集中的内部类?如果没有,那我错过了什么吗?
其他详细信息: 我将指定一个链接,其中包含我的领域驱动设计(模型和基础设施层)的类图,它使用三个组件/项目:
为了方便起见,我将对上面的类图进行一些解释:
- 大多数外部边界/矩形用于程序集/项目
即;
A)sharemanagement.model,
B) 共享管理,
C) sharemanagement.infrastructure.repositories
这样 sharemanagement 就像核心(或库),由 sharemanagement.model 和 sharemanagement.infrastructure.repositories 引用,但 sharemanagent 程序集不引用这两者中的任何一个(因为 sharemanagement 是核心/基础库/程序集,其他程序集取决于。
- 矩形内的矩形是子目录。
现在,sharemanagement.model 请求 sharemanagement(使用其 repositoryFactory)返回 CompanyRepository 的实例(在 Sharemanagement.Infrastructure.Repositories 中定义),sharemanagement 使用 Type.GetType 和 Activator.CreateInstance() 获取该实例
并且,在创建 CompanyRepository 实例的实例时(如上所述使用 Activator.CreateInstance()),CompanyRepository 的基类即“SQLRepositoryBase”(在 Sharemanagement 中定义)获取 EntityFactory 实例(在 Sharemanagement.Infrastructure 中定义。存储库)使用 Type.GetType(来自 EntityFactoryBuilder 类的 buildEntityFactory 方法内部)。
要注意的要点是 CompanyFactory 是内部类并在程序集“sharemanegement.infrastructure.repositories”中定义,而 EntityFactoryBuilder.buildentityFactory() 类是在程序集“sharemanagement”中定义的。
最佳答案
However, in my case another assembly is able to access internal class in another assembly using Type.GetType and is also able to create its object using Activator.CreateInstance() successfully.
确实,假设尝试这样做的代码具有适当的信任级别。事实上,完全可信的代码可以通过反射做各种事情,包括改变私有(private)字段。在信任度降低的环境中运行的代码无法执行这些操作。
关于C#.NET : internal class accessible from another class using Type. GetType 和 Activator.CreateInstance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080247/