我正在寻找一种在应用启动之前或期间检测损坏的依赖关系的方法,但是在编译之后。
假设MyApplication
有一个代码路径,可以调用Dependency.Foo()
dependency.dll
。
现在假设我删除Foo()
并部署更新的dependency.dll
而不重新编译MyApplication
。
MyApplication
将启动并正常工作,直到它遇到想要调用Dependency.Foo()
的代码路径。然后用MethodNotFoundException
爆炸。
有没有办法可以检测到破坏的依赖关系并使MyApplication
快速失败?
我正在考虑扫描bin文件夹中的dll并验证它们对其他托管dll的调用。一位同事提到这在java世界中很容易做到,但我不知道他在说什么......
答案 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
这是设计加载项合同的一般方法,允许您安全地处理不同版本的合同。