注册.Net程序集时,请避免加载外部引用

时间:2015-03-11 11:12:09

标签: .net assemblies com-interop regasm

我们有一个.Net DLL可以通过COM interop获得,它可以作为第三方.NET库的包装。

在绝大多数情况下都不需要这个第三方库,所以我们的设置中没有包含它,但我们的包装DLL是。

当我们尝试注册我们的包装器DLL(regasm)失败时出现问题:

  

RegAsm:错误RA0000:无法加载文件或程序集“3rdParty.Application.Library,Version = 5.3.0.0,Culture = neutral,PublicKeyToken = 0123456789abcdef”或其中一个依赖项。系统找不到指定的文件。

由于我们的包装器在无法加载第三方库时已经报告了有意义的错误,有没有办法让regasm不尝试加载它(如/delayload)所以我们的应用程序可以加载它并获得运行时出错?

This article表明程序集已加载延迟,但在注册COM互操作程序集时似乎不适用。

1 个答案:

答案 0 :(得分:4)

通常,.NET依赖项是延迟加载的,但延迟是直到包含引用依赖程序集中某些内容的方法或字段的类型的静态构造。由于RegAsm使用反射来遍历程序集中的所有类型,因此它将始终加载所有依赖项。

您可以做的一件事就是打破COM程序集,将引用非分布式库的任何内容放入您始终分发的单独(非COM)库中。当RegAsm扫描第一个库时,第二个库可能会自动加载,但只要你将其类型保留在第一个程序集之外,它就不应该加载第三个库。

理想情况下,尽可能保持COM可见类型,并在单独的.NET程序集中使用真正的实现。这也意味着.NET客户端可以完全跳过COM层。