如何优雅地防止 Web 服务代理暴露给 COM?

sha*_*oth 3 .net c# com com-interop visual-studio

我有一个 C# 程序集,用作非托管 C++ 应用程序使用的进程内 COM 服务器。该程序集使用永远不会更改的 Web 服务,因此无需更新 Web 服务代理类。这就是为什么代理类被创建一次,Reference.cs文件被简单地放入存储库中并仅从那里进行编译。

问题是默认情况下 Web 服务代理类是公共的,因此暴露给 COM。这会导致类型库膨胀并污染注册表。将可见性更改为内部会破坏程序集,因此这些实体需要保持公共状态,但不需要暴露给 COM。

愚蠢的方法是接近文件中的每个公共接口/类Reference.cs并将其标记为

[System.Runtime.InteropServices.ComVisible(false)]
Run Code Online (Sandbox Code Playgroud)

此后,它不再暴露于 COM。

有没有更好的办法?

Rob*_*cke 5

你可以

  • 将程序集本身标记为 not ComVisible,然后将要公开的所有接口/类/枚举显式标记COMComVisible
  • 使用第二个文件和部分类将您的代理类型标记为ComVisible(false)

    [System.Runtime.InteropServices.ComVisible(false)]
    partial class YourProxyType {} 
    
    [System.Runtime.InteropServices.ComVisible(false)]
    partial class AnotherProxyType {}
    
    Run Code Online (Sandbox Code Playgroud)