[英]managed DLL MethodNotFoundException
我正在寻找一种方法,可以在应用启动之前或期间但在编译之后检测破坏的依赖关系。
假设MyApplication
具有一个代码路径,该代码路径调用Dependency.Foo()
,该代码位于dependency.dll
。 现在假设我删除了Foo()
并部署了更新的dependency.dll
而无需重新编译MyApplication
。
MyApplication
将启动并正常运行,直到遇到要调用Dependency.Foo()
的代码路径。 然后用MethodNotFoundException
炸毁。
有没有一种方法可以检测到损坏的依赖关系并使MyApplication
快速失败? 我正在考虑将扫描bin文件夹中的dll并验证它们对其他托管dll的调用的方法。 一位同事提到这在Java世界中很容易做到,但是我不知道他在说什么...
这似乎是个疯狂的建议,但是您可以考虑使用libcheck并为给定版本的MyApplication
运送“受支持的”存储文件。 然后,您可以验证(不确定是否可以在运行时完成此操作),并将当前存储与支持的存储进行比较,然后可以报告任何API中断。
实际上,解决方案是在交付软件时通过自动构建和质量网关来控制版本。
但是正如@SimonC所说,cecil也可以工作。
您可以使用反射来确定MyApplication
正在加载时Dependency.Foo
存在。
类似于以下内容:
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!
}
有关更多信息: MSDN上的System.Type
如果要开发自己的外接程序体系结构,则必须遵循其他答案。 但是,如果您打算使用更可靠的产品,请考虑Microsoft随.NET 4一起提供的东西,称为Managed Extensibility Framework,
http://msdn.microsoft.com/zh-CN/magazine/ee291628.aspx
这是设计附加合同的一般方法,可让您安全地处理不同版本的合同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.