1

我有一个围绕混合(托管/非托管)类型的 .NET dll 包装器。如果硬盘驱动器中缺少某些关键 dll 或它们的位置未输入到路径中,则该类型将无法加载,从而导致 TypeLoadException(“无法加载文件或程序集或其依赖项之一”)。这阻碍了使用此类库的任何实用程序的 xcopy 可部署性。

我宁愿在不指示所有客户端更改客户端代码的情况下解决此问题。我希望通过在 CLR 加载类型之前运行代码来实现这一点。我已将其依赖项包含在分发中包含的 zip 文件中。

客户端调用静态工厂方法。

var MyMixedTypeInstance = MyMixedType.Create();

但是,由于工厂方法签名的返回类型是 MyMixedType,因此会在执行 create 方法中的任何代码之前尝试加载 MyMixedType。我考虑过将返回类型作为接口来避免这种情况。但是,如果某些接口处理(例如返回)具体的混合类型,那么 AFAICT 我又回到了原点。

我尝试过使用静态构造函数之类的东西,但似乎(可能你们所有人都知道)公共 API 公开的类型会立即加载。但是,我不太了解类型的加载是如何展开的,所以我可能会遗漏一些明显的东西。我知道您可以帮助 CLR 解析程序集,但我不知道这是否与类型有关。

自然,可以创建一个完全独立的“MakeSureNeededBinariesAreInPlaceAndInPath”类型的方法并要求/强制所有客户端在调用 Create() 方法之前调用它,但如果可以的话,我想避免它。

例如,是否有任何属性可以装饰类型以拦截类的类型加载?

4

0 回答 0