Visual studio Visual Studio-注册COM互操作

Visual studio Visual Studio-注册COM互操作,visual-studio,com,Visual Studio,Com,在Visual Studio(C#)中,勾选“注册COM互操作”将更新Windows环境,以便我的Visual Studio项目、其依赖的Visual Studio项目(在同一解决方案中)和依赖的DLL文件都可用于同一计算机上的另一个使用COM的应用程序。此COM消费应用程序工作正常 如果我希望另一台机器上的消费应用程序可以使用相同的COM对象,我必须做什么 我假设我仍然使用相同的标志集进行构建(以便DLL文件具有COM内容)?我假设我必须注册COM DLL文件(例如regasm)-不幸的是,这

在Visual Studio(C#)中,勾选“注册COM互操作”将更新Windows环境,以便我的Visual Studio项目、其依赖的Visual Studio项目(在同一解决方案中)和依赖的DLL文件都可用于同一计算机上的另一个使用COM的应用程序。此COM消费应用程序工作正常

如果我希望另一台机器上的消费应用程序可以使用相同的COM对象,我必须做什么

我假设我仍然使用相同的标志集进行构建(以便DLL文件具有COM内容)?我假设我必须注册COM DLL文件(例如regasm)-不幸的是,这不起作用-我是否注册我正在构建的每个DLL文件以及它们引用的每个DLL文件库


请不要对我的COM知识做任何假设。

你没有提供足够的信息来肯定地回答,但是有足够的提示来猜测你在做什么

当客户端应用程序请求COM对象时,将调用.NET运行时,它将根据RegAsm存储的信息(特别是通过/codebase参数)定位COM公开程序集DLL。但在那之后,所有的.NET程序集加载规则——包括依赖项的加载

如果COM程序集具有依赖项,则依赖程序集必须可从客户端进程定位。依赖项是否与COM DLL位于同一文件夹中并不重要—加载这些依赖项的是进程,而不是COM DLL。NET运行时使用一个名为Fusion的进程来决定在何处查找.NET程序集

你有两个实际的选择:

  • 将COM DLL、其依赖项和客户端EXE全部放在同一文件夹中。如果只有一个客户机,并且您控制该客户机(例如,如果客户机是IIS,则不要这样做)。这是最简单的解决办法

  • 为所有.NET组件提供一个强名称,并将它们部署到GAC1您仍然需要运行RegAsm;但是不要使用
    /codebase
    参数

  • 也可以通过为客户端应用程序提供包含正确条目的清单来定制融合规则,但这太麻烦了。其他选择更为实际

    如果这不能描述您的问题,那么我将使用SysInternals(现在的Microsoft)进程监视器和.NET fusion日志功能的组合来查看进程在哪里查找不同的DLL



    1从技术上讲,您不必将主COM DLL放在GAC中,但在您必须处理GAC时,为COM DLL使用/codebase是没有意义的。在这一点上,您不妨将它们全部放在GAC中

    勾选“注册com互操作”与Regasm.exe yourlibrary.dll/tlb/codebase完全相同。“这不起作用”可能意味着太多的事情。equivalance建议我只需要注册一个dll,公开互操作接口的dll,它的依赖关系必须透明地处理。当我在第二个m/c上这样做时,我得到ActiveX自动化服务器无法创建对象。这表明VS比Regasm做得更多,因为在VS m/c上,使用COM的应用程序不会抱怨。我试图通过设置标志来理解VS在做什么,这样我就可以在另一个m/c上复制它,而无需在那里安装VS。dll是一个库类,目标是.net framework,但主要是COM使用者的COM资源。我发现'Register for Interop'和'regasm mycom.dll/tlb/codebase'并没有使用完全相同的内容填充注册表,即使在vs框上也是如此。实际上,使用“Register for Interop”可以添加更多注册表项以及com客户端可以使用的com dll。这又回到了我最初的问题:我如何模仿VS的“注册进行互操作”。没有这种模拟,我无法在第二个盒子上安装dll。dll在这两种情况下都是相同的。我最初怀疑这与依赖性有关——我很高兴事实并非如此。可能是因为与regasm不同。您在“注册以进行互操作”中看到了哪些在regasm中看不到的密钥?HKLM\Software\WOW6432Node\classes\CLSID。。。大约6,我现在相信oleview从tbl生成的idl是相同的。我还知道VS使用相同的regasm,因为regasm绑定到框架版本&在注册表中引用。