我们有一个规则处理系统,其中每个规则由一个类表示,所有规则都实现了一个公共接口。有时,我们会向程序集添加规则(类),但是当该规则出现进行处理时,系统无法找到该类。我们用来运行规则的代码如下所示。
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个被发现,但有两个没有,而未找到的两个是刚刚添加的规则。谁能想到可能导致这种情况的原因呢?
更新:我找到了实际答案并接受了最接近实际答案的答案,因为它使我朝着正确的方向前进。我们有两个代码分支,一个用于dev,另一个用于我们的开发机器上的QA。 applciation是一个Web服务,为了调试它,我们必须启动单元测试,附加到aspnet_wp.exe进程,然后设置断点。它无法找到类的原因是因为机器指向Web服务的QA实例,因此,找不到任何新类;所有旧的都在那里,因为他们已被部署到QA分支。感谢所有的评论,并最终引导我到正确的地方看,最终所有关于部署的位置,但不是你想的方式。 :)
答案 0 :(得分:2)
如果重启后此问题仍然存在,则您有3个潜在问题中的1个。
您实际上并没有部署它。
您的应用使用某种类型的自定义程序集缓存机制,并且不会根据在拾取文件夹中查看新程序集进行刷新。
您正在部署它,但没有部署到正确的位置/服务器。
如果我打赌,我会看到#3号门后面是什么。
<强>更新强>
根据评论:我没有意识到你在本地运行而不是部署到服务器。
也就是说,听起来您正在通过程序集名称而不是通过项目级别引用来引用程序集。 VS在开发期间缓存程序集,可能不会刷新本地缓存。
此外,根据项目类型,有时会对程序集的实际位置感到困惑。例如,在网站项目中,如果在GAC或其他路径中找到程序集的副本,VS将很乐意(通常不正确地)重新定位程序集引用。 Web应用程序项目通常不会出现此行为。
在主项目中,右键单击程序集引用,查看它从哪里加载dll。
答案 1 :(得分:1)
如果我理解正确并且程序集可能在运行时被替换,那么即使你指定了不同的路径,你所拥有的问题Assembly.LoadFrom
也会返回相同的程序集,如果它的标识是相同的。 / p>
请考虑使用LoadFile
。请参阅有关选择绑定上下文here的说明。
但首先,您必须确保程序集确实已更改。在此方法上设置一个断点,当它命中时,打开位于Reflector dllPath
的文件(虽然它仍然是免费的:-)并确保你实际上是在尝试加载新的程序集。
我首先要在预期位置删除程序集,然后检查代码是否失败。