Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
注册.Net程序集时避免加载外部引用_.net_Assemblies_Com Interop_Regasm - Fatal编程技术网

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

注册.Net程序集时避免加载外部引用,.net,assemblies,com-interop,regasm,.net,Assemblies,Com Interop,Regasm,我们有一个.Net DLL,可以通过COM互操作获得,它充当第三方.Net库的包装器 这个第三方库在绝大多数情况下都是不需要的,所以我们的设置中没有包含它,但是我们的包装器DLL是 当我们尝试注册包装器DLL(使用regasm)时会出现问题,该DLL失败原因如下: RegAsm:错误RA0000:无法加载文件或程序集“3rdParty.Application.Library,Version=5.3.0.0,Culture=neutral,PublicKeyToken=0123456789abcd

我们有一个.Net DLL,可以通过COM互操作获得,它充当第三方.Net库的包装器

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

当我们尝试注册包装器DLL(使用
regasm
)时会出现问题,该DLL失败原因如下:

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

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


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

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

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


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

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

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


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

类似的问题:这不是好兆头,Regasm.exe确实非常努力地避免涉及依赖项。注册程序集的方法不止一种,只需编写正确的注册表项即可。首先要尝试的是使用Regasm.exe/regfile选项,以便获得一个.reg文件,然后在缺少依赖项的情况下进行测试。自定义[ComRegisterFunction]是另一种方式。或者只是一个直接写入密钥的普通安装程序。但是首先要测试.reg文件。您可以从RegistrationServices.RegisterAssembly()获得失败的调用堆栈。谢谢,创建注册表文件并单独导入它是最后的联合手段,它会延迟绑定所有内容,而根本不引用它。
ComRegisterFunction
不会取代整个“DLLRRegisterServer”等效,但按需要注册的类型调用,并且仍然会遇到相同的程序集解析问题。直接写入注册表可能是唯一的选择。嗯,只要你不知道为什么需要依赖项,你就不知道[ComRegisterFunction]是否会修复它。如果需要帮助,请向我们展示从RegistrationServices.RegisterAssembly()获得的调用堆栈。类似问题:这不是好兆头,Regasm.exe确实非常努力地避免涉及依赖项。注册程序集的方法不止一种,只需编写正确的注册表项即可。首先要尝试的是使用Regasm.exe/regfile选项,以便获得一个.reg文件,然后在缺少依赖项的情况下进行测试。自定义[ComRegisterFunction]是另一种方式。或者只是一个直接写入密钥的普通安装程序。但是首先要测试.reg文件。您可以从RegistrationServices.RegisterAssembly()获得失败的调用堆栈。谢谢,创建注册表文件并单独导入它是最后的联合手段,它会延迟绑定所有内容,而根本不引用它。
ComRegisterFunction
不会取代整个“DLLRRegisterServer”等效,但按需要注册的类型调用,并且仍然会遇到相同的程序集解析问题。直接写入注册表可能是唯一的选择。嗯,只要你不知道为什么需要依赖项,你就不知道[ComRegisterFunction]是否会修复它。如果需要帮助,请向我们显示从RegistrationServices.RegisterAssembly()获得的调用堆栈。