C# 我可以在加载CLR类型之前运行代码吗?

C# 我可以在加载CLR类型之前运行代码吗?,c#,clr,.net-assembly,mixed-mode,fusion,C#,Clr,.net Assembly,Mixed Mode,Fusion,我有一个混合(托管/非托管)类型的.NET dll包装器。如果硬盘中缺少某些关键dll,或者路径中没有输入它们的位置,则类型将不会加载,从而导致TypeLoadException(“无法加载文件或程序集或其依赖项之一”)。这会妨碍使用该类库的任何实用程序的xcopy部署 我更愿意在不指示所有客户端更改客户端代码的情况下修复此问题。我希望通过在CLR加载类型之前运行代码来实现这一点。我已经将它的依赖项包含在一个zip文件中,该文件包含在发行版中 客户端调用静态工厂方法 var MyMixedTyp

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

我更愿意在不指示所有客户端更改客户端代码的情况下修复此问题。我希望通过在CLR加载类型之前运行代码来实现这一点。我已经将它的依赖项包含在一个zip文件中,该文件包含在发行版中

客户端调用静态工厂方法

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

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

当然,可以创建一个完全独立的“MakeSureneedBinariesReinPlaceAndInPath”类方法,并要求/强制所有客户端在调用create()方法之前调用它,但如果可以的话,我希望避免使用它


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

不确定这是否是您所需要的,但您可以尝试侦听类AppDomain的事件AssemblyResolve。这可能有助于程序集很好地解析。但是,当使用确切的类型(或公开该类型的类)时,它会抛出所述的异常。我不认为TypeResolveEvent是我正在寻找的,因为它是关于定位正确的程序集的。即使是这样,也要由客户机连接处理程序。当有人试图在类型类初始化之前访问我的库中的类型时,我需要运行自定义代码。