1

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

假设MyApplication有一个调用 的代码路径Dependency.Foo(),它位于dependency.dll. 现在假设我在不重新编译的情况下删除Foo()并部署更新的.dependency.dllMyApplication

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

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

4

3 回答 3

0

如果您正在开发自己的插件架构,则必须遵循其他答案。但是,如果您打算使用更可靠的东西,请考虑 Microsoft 附带的 .NET 4,称为托管可扩展性框架,

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

这是一种设计插件合约的通用方法,允许您安全地处理不同版本的合约。

于 2013-08-30T02:36:50.643 回答
0

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

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

但正如@SimonC 所说,cecil 也可以工作。

于 2013-08-30T01:32:53.063 回答
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!
}

有关详细信息: MSDN 上的 System.Type

于 2013-08-30T01:49:51.030 回答