gpt4 book ai didi

c# - 通过反射找不到添加到程序集中的新类

转载 作者:行者123 更新时间:2023-11-30 16:31:05 25 4
gpt4 key购买 nike

我们有一个规则处理系统,其中每个规则都由一个类表示,所有规则都实现一个通用接口(interface)。有时,我们会向程序集添加一个规则(类),但是当该规则开始处理时,系统找不到该类。我们用来运行规则的代码如下所示。

private void runClass(string dllName, string className, string methodName, string ruleNamespace)
{
Assembly _Assemblies = Assembly.LoadFrom(dllName);

Type _Type = null;
string nameSpace = _Assemblies.ManifestModule.Name.Substring(0, _Assemblies.ManifestModule.Name.ToLower().IndexOf(".dll"));
if (ruleNamespace.Trim() != "")
nameSpace = nameSpace + "." + ruleNamespace;
_Type = _Assemblies.GetType(nameSpace + "." + className);
if (_Type == null)
throw new Exception("Cannot find class " + className + " in " + nameSpace + ".");

IRule rule = (IRule)Activator.CreateInstance(_Type);
rule.Process();
}

我尝试过清理构建、从头开始重建、重新启动、手动删除 DLL 并重建以及其他一些我现在不记得的事情。奇怪的是,一个程序集中可能有 50 条规则,其中 48 条找到了,但有两条没有找到,而没有找到的两条是刚刚添加的。谁能想到是什么原因造成的?

更新:我找到了实际答案并接受了最接近实际答案的答案,因为它引导我朝着正确的方向前进。我们有两个代码分支,一个用于开发,一个用于开发机器上的 QA。该应用程序是一个 Web 服务,为了对其进行调试,我们必须启动单元测试,附加到 aspnet_wp.exe 进程,然后设置断点。找不到类的原因是机器指向了 Web 服务的 QA 实例,因此,将找不到任何新类;所有旧的都在那里,因为他们已经部署到 QA 分支。感谢所有评论,并最终将我带到了正确的位置,最终一切都与部署位置有关,但不是您想象的那样。 :)

最佳答案

如果此问题在重新启动后仍然存在,那么您遇到了 3 个潜在问题中的 1 个。

  1. 您实际上并没有部署它。

  2. 您的应用使用某种类型的自定义程序集缓存机制,并且不会根据在拾取文件夹中看到新程序集而刷新。

  3. 您正在部署它,但未部署到正确的位置/服务器。


如果我要下注,我会看看 3 号门后面是什么。


更新
根据评论:我没有意识到您是在本地运行它还是部署到服务器。

也就是说,听起来您是通过程序集名称而不是通过项目级别引用来引用程序集。 VS 在开发期间缓存程序集,可能不会刷新您的本地缓存。

此外,根据项目类型,有时会混淆程序集的实际位置。例如,在网站项目中,如果 VS 在 GAC 或其他路径中找到程序集的副本,它会很高兴地(通常是错误地)重新定位您的程序集引用。 Web 应用程序项目通常不会表现出这种行为。

在主项目中,右键单击程序集引用并查看它认为从何处加载 dll。

关于c# - 通过反射找不到添加到程序集中的新类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079817/

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