我在尝试重新创建一个TypeLoadException以进行演示,因此我设置了一个非常滑稽的库,看起来像这样:
这是我的问题:这个单元测试失败了。但不是因为我的
发生了什么?显然,这是一个完全虚构的场景,但我仍然想知道发生了什么,以便可以在运行时避免此错误或至少处理它(是的,我知道最终的解决方案是确保所有库版本都相同)。
最糟糕的部分是,任何对该类的访问,例如typeof(ProxyForV2.ConsistentThingImpl)或ProxyForV2.ConsistentThingImpl.SomeStaticFunction()都会导致这个无法捕获的TypeLoadException,因此很明显问题源自于.NET尝试加载类时,而不是任何赋值操作。
我唯一缓解此问题的想法是尝试在不同的应用程序域中加载类型,以便它不会干扰,然后进行一些疯狂的反射操作,以查看接口是否与实现兼容,但这似乎是完全过度的。
总之:为什么似乎无法以“正常”的方式捕获此问题,并且如何在运行时解决此类问题?
TestProject --> TheLibrary [1.0]
\-> ProxyForV2 -> TheLibrary [2.0]
TheLibrary
1版本有以下相关接口:
public interface IConsistentThing
{
int ConsistentProperty { get; set; }
}
public interface IShrinkingThing
{
int RemovedProperty { get; set; }
}
TheLibrary 的第二个版本接口如下所示:
public interface IConsistentThing
{
int ConsistentProperty { get; set; }
}
public interface IShrinkingThing
{ }
ProxyForV2
有一个类实现了版本2.0的IShrinkingThing
接口:
public class ShrinkingThingImpl : IShrinkingThing
{
public int ConsistentProperty { get; set; }
}
因此,在TestProject
中,如果有人尝试分配ProxyForV2.ShrinkingThingImpl
,我期望会引发TypeLoadException
,因为第一个版本的接口有一个在第二个版本中没有实现的属性。 为了证明这一点,我有一个单元测试看起来像:
[TestMethod]
public void ShrinkingThingBreaks()
{
try
{
IShrinkingThing thing = new ProxyForV2.ShrinkingThingImpl();
Assert.Fail("This should have caused a TypeLoadException");
}
catch (TypeLoadException)
{
// valid
}
}
这是我的问题:这个单元测试失败了。但不是因为我的
Assert.Fail
,这让我感到意外。测试输出如下:
所以一个测试方法TestProject.LoadTester.ShrinkingThingBreaks引发异常:System.TypeLoadException:程序集“ProxyForV2,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”中类型“ProxyForV2.ShrinkingThingImpl”的方法“get_RemovedProperty”没有实现。
TypeLoadException
被抛出,虽然它唯一可能被抛出的地方是在一个带有catch(TypeLoadException)
的try
块中,但异常却无法被捕获。此外,即使我使用一个捕获所有异常的语句,单元测试仍然以前面相同的错误失败。[TestMethod]
public void ShrinkingThingBreaks()
{
try
{
IShrinkingThing thing = new ProxyForV2.ShrinkingThingImpl();
Assert.Fail("This should have caused a TypeLoadException");
}
catch
{
// valid
}
}
发生了什么?显然,这是一个完全虚构的场景,但我仍然想知道发生了什么,以便可以在运行时避免此错误或至少处理它(是的,我知道最终的解决方案是确保所有库版本都相同)。
最糟糕的部分是,任何对该类的访问,例如typeof(ProxyForV2.ConsistentThingImpl)或ProxyForV2.ConsistentThingImpl.SomeStaticFunction()都会导致这个无法捕获的TypeLoadException,因此很明显问题源自于.NET尝试加载类时,而不是任何赋值操作。
我唯一缓解此问题的想法是尝试在不同的应用程序域中加载类型,以便它不会干扰,然后进行一些疯狂的反射操作,以查看接口是否与实现兼容,但这似乎是完全过度的。
总之:为什么似乎无法以“正常”的方式捕获此问题,并且如何在运行时解决此类问题?