繁体   English   中英

托管DLL MethodNotFoundException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM