托管DLL MethodNotFoundException

时间:2013-08-30 01:17:46

标签: c# .net

我正在寻找一种在应用启动之前或期间检测损坏的依赖关系的方法,但是在编译之后。

假设MyApplication有一个代码路径,可以调用Dependency.Foo() dependency.dll。 现在假设我删除Foo()并部署更新的dependency.dll而不重新编译MyApplication

MyApplication将启动并正常工作,直到它遇到想要调用Dependency.Foo()的代码路径。然后用MethodNotFoundException爆炸。

有没有办法可以检测到破坏的依赖关系并使MyApplication快速失败? 我正在考虑扫描bin文件夹中的dll并验证它们对其他托管dll的调用。一位同事提到这在java世界中很容易做到,但我不知道他在说什么......

3 个答案:

答案 0 :(得分:0)

这感觉就像一个疯狂的建议,但您可以查看使用libcheck并为给定版本的MyApplication发送“支持的”商店文件。然后您可以验证(不确定这是否可以在运行时完成)并将当前存储与支持的存储进行比较,并且可以报告任何API中断。

实际上,解决方案是在运送软件时通过自动构建和质量网关控制版本。

但正如@SimonC所说,塞西尔也可以工作。

答案 1 :(得分:0)

您可以使用反射来确定Dependency.Foo是否存在MyApplication正在加载 有点像:

if (typeof(Dependency).GetMethod("Foo") == null)
{
  //Fail fast, Dependency.Foo could not be found!
}

同样的想法也适用于字段和属性,或者更一般地,适用于任何类成员。

if (typeof(Dependency).GetMember("Bar").Length == 0)
{
  //Fail fast, Dependency.Bar could not be found!
}

了解更多信息: System.Type on MSDN

答案 2 :(得分:0)

如果您正在开发自己的加载项体系结构,则必须遵循其他答案。但是,如果您计划使用更可靠的东西,请考虑Microsoft随.NET 4提供的内容,称为Managed Extensibility Framework,

http://msdn.microsoft.com/en-us/magazine/ee291628.aspx

这是设计加载项合同的一般方法,允许您安全地处理不同版本的合同。