无需注册 COM 即可与 C# 互操作,可能吗?

2023-12-26

是否可以通过 Dotnet 互操作和 C# 使用免注册 COM?如果是这样,如何在 C# 项目中添加对 COM 对象的引用?

我有一个免费的 ATL COM 服务器 dll,带有嵌入式清单和两个测试客户端,一个是 cpp,另一个是 c#。 cpp 客户端使用 import 语句正确引用 COM 对象,并且

#pragma comment(linker, "\"/manifestdependency:type='win32' name='TestComSvr2' version='1.0.0.0'\"")

或者在 Linker->Manifest File 选项下将“Additional Manifest Dependency”设置为“type='win32' name='TestComSvr1' version='1.0.0.0'”,之后只要 COM 组件存在,cpp 客户端就能正确运行位于同一目录中。

但 C# 客户端根本拒绝玩。

尝试添加对未注册的 COM 组件 dll 或未注册的 tlb 的文件引用会导致错误:

“无法添加对‘blah blah’的引用。请确保该文件可访问,并且它是有效的程序集或 COM 组件”。

仅使用“regtlib TestComSvr”注册类型库,然后创建对此的文件或 COM 引用会导致 c# 项目无法使用以下命令进行构建:

“加载类型库/Dll 时出错。(HRESULT 异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))”。

在 c# 项目中正常注册 COM 组件并创建引用,将引用设置为“隔离”,构建 c# 项目,然后取消注册该组件并运行 c# 项目会导致此异常:

由于以下错误,检索 CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} 的组件的 COM 类工厂失败:80040154 类未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。

注意:即使这有效,它也不是一个有用的案例,因为最终它仍然需要注册组件,我只是测试了它的彻底性。

到目前为止,我能够从 C# 引用 COM 对象的唯一方法是注册 COM 对象本身,这当然完全违背了这一点,因为它根本就不是免注册的。

有人有什么想法吗?

(这是在带有 VS2010 sp1 的 WinXP 上)。


你需要:

  • add the 将免费的 COM 条目注册到您的程序集清单 xml 文件中 http://msdn.microsoft.com/en-us/library/ms973913.aspx, and
  • 将该清单构建到您的 C# 可执行文件中 https://stackoverflow.com/a/8844086/12597.

  1. 您需要提供免注册的 COM 程序集清单,在其中声明您的依赖关系Neutrino.TestComSvr2集会:

    <?xml version="1.0" encoding="utf-8"?>
    <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" 
                xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" 
                xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
       <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    
       <!-- We depend on our COM object -->
       <dependency>
          <dependentAssembly>
              <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" />
          </dependentAssembly>
       </dependency>
    
    
       <!-- 
           Everything else in this sample manifest is not relavent to this answer, 
           but every developer should be doing their job and writing correct 
           Windows programs 
       -->
    
       <!-- Disable file and registry virtualization. -->
       <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
          <security>
             <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
             </requestedPrivileges>
          </security>
       </trustInfo>
    
       <!-- We are high-dpi aware on Windows Vista -->
       <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
          <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
             <dpiAware>true</dpiAware>
          </asmv3:windowsSettings>
       </asmv3:application>
    
       <!-- Declare that we were designed and tested on Windows 7-->
       <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
          <application>
              <!--The ID below indicates application support for Windows 7 -->
              <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
              <!--The ID below indicates application support for Windows Vista -->
              <!-- supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/ -->
          </application>
       </compatibility>
    
       <!-- We depend on Common Controls version 6 (i.e. "enable themes") -->
       <dependency>
          <dependentAssembly>
             <assemblyIdentity
                   type="win32"
                   name="Microsoft.Windows.Common-Controls"
                   version="6.0.0.0"
                   processorArchitecture="*"
                   publicKeyToken="6595b64144ccf1df"
                   language="*"
             />
          </dependentAssembly>
       </dependency>
    

    Note:我的问题中有类似的清单ASP.NET 中的免注册 COM? https://stackoverflow.com/questions/9162817/registration-free-com-from-asp-net

  2. 然后您需要将此应用程序清单包含在您的 C# exe 中:

    1. 右键单击解决方案资源管理器中的项目。
    2. Click “添加新项目”.
    3. Select “应用程序清单文件”.

这些步骤与 MSDN 上可以找到的类似将清单添加到托管应用程序 http://msdn.microsoft.com/en-us/library/windows/desktop/ee308410%28v=vs.85%29.aspx.

您还需要确保您的Neutrino.TestComSvr2程序集包含其免注册的 COM 条目:

Neutrino.TestComSvr2.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" />

   <file name = "ContosoFrobber.dll">

      <comClass
            progid="Frobber.Gizmo"
            clsid="{00028C00-0000-0000-0000-000000000046}"
            description="Gizmo Frobber by Contoso"
            threadingModel = "Apartment" />

      <typelib 
            tlbid="{00028C01-0000-0000-0000-000000000046}"
            version="1.0" 
            helpdir=""/>
   </file>
</assembly>

还有 blingo blago,你应该工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无需注册 COM 即可与 C# 互操作,可能吗? 的相关文章

  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 具有固定页眉和页脚以及可滚动内容的 Flexbox

    我正在尝试让弹性盒设计发挥作用 我不是 HTML CSS 专家 我有一个弹性盒设计 具有固定的页眉和页脚以及占据页面其余可用空间的内容 当我将数据放入比可用空间长的内容区域时 内容会滚动 但我想实现不同的目标 我想在内容区域中有几个 div
  • CodeIgniter GROUP_CONCAT 并加入

    我试图找到一种方法将这两个表连接在一起 我能够做到这一点 但如果它发现多个匹配的值 它会再次显示产品表中的所有内容 现在我尝试一起使用 MySQL group concat 以便能够列出数组中一个字段中的所有 tName 但我不断收到 My
  • 将 MySQL 转储导入到 PostgreSQL 数据库

    如何将 xxxx sql 转储从 MySQL 导入到 PostgreSQL 数据库 这个问题有点老了 但几天前我正在处理这种情况并发现pgloader io http pgloader io 这是迄今为止最简单的方法 您需要安装它 然后运行
  • java.util.concurrent.TimeoutException:android.view.ThreadedRenderer.finalize() 10秒后超时

    我收到了有关 Lollipop 的奇怪崩溃报告 我的应用程序基本上是一个浏览器 因此它大量使用 WebView 但我不知道问题在那里发生 无论如何 崩溃报告没有提供太多有用的信息 这基本上就是我在下面粘贴的内容 java util conc
  • atob 函数不应在新代码中使用?

    我需要使用atob在我正在处理的 React 项目中 有一个函数 但 VSCode 在函数调用中插入了一行 悬停时我收到以下消息 提供此功能只是为了与旧版 Web 兼容 平台 API 永远不应该在新代码中使用 因为它们使用 表示二进制数据的
  • 无法收集 pydev 的 python 解释器信息

    操作系统 Windows 7 x64 蟒蛇 2 7 3 pydev 2 7 1 2012100913 Eclipse 版本 Juno Service Release 1 内部版本号 20121004 1855 我无法在 Pydev 中配置
  • 如何检查exe是否从服务器访问

    这是一个客户端服务器应用程序 我正在创建一个更新程序 它将替换 exe 文件列表 运行脚本以及其他需要更新的内容 这将安装在服务器上 首先 我需要检查可执行文件是否通过网络共享打开 我可以通过进入计算机管理然后共享文件和打开文件来手动执行此
  • 在keras中定义模型(include_top = True)

    有人能告诉我在 keras 中定义模型时 include top True 意味着什么吗 我在 Keras 文档中读到了这一行的含义 它表示 include top 是否包含网络顶部的全连接层 我仍在寻找这行代码的直观解释 ResNet50
  • Dropwizard Response.status(Response.Status.NOT_FOUND).build() 返回 html

    如果确实缺少资源 我的 API 将返回以下内容 code 404 message HTTP 404 Not Found 当我使用代码通过我的资源返回 404 时Response status Response Status NOT FOUN
  • 在 LINQ to 对象的语句中

    LINQ to 对象中是否存在与 SQL IN 语句等效的语句 Yes Contains http msdn microsoft com en us library system linq enumerable contains aspx
  • Java 中的 PPMD​​ 压缩?

    有谁知道 PPMD 压缩算法的 Java 实现吗 我还没有找到 Java 实现 但有一个 C 实现http users senet com au mjbone Compression html http users senet com au
  • 如何在 Windows 窗体应用程序中创建全局错误处理程序?

    我认为有一个组件允许创建全局错误处理 例如 当发生不好的事情时 我自己会抛出异常 例如 throw new ArgumentNullException playlist is empty 我怎样才能在全球范围内捕捉到它 您可以通过以下方式完
  • 使用 std::make_shared 抽象类实例化时出错

    我将省略相当多的代码 因为这些是一些相当大的对象 而我的问题实际上只涉及 std make shared 的操作 我在命名空间 SYNC 中有一个名为 D3D11Shader 的对象 这有一个static函数调用 SYNC D3D11Sha
  • Spring、Infinispan 和 JBoss 7 集成

    我正在尝试使用 JBoss 7 Infinispan 缓存作为两个战争部署的基于 spring 的应用程序的通信形式 稍后会详细介绍 我在访问 JBoss 托管缓存管理器时遇到问题 当我使用 DefaultCacheManager cach
  • 如何在 WordPress 上找到我的 php.ini?

    我想增加我的 WordPress 网站上的最大执行时间 我知道我应该编辑 php ini 但似乎找不到它 有小费吗 看到这个问题我真多啊 我所看到的一切都缺乏真正的答案 php ini 应该位于wp admin目录 如果不是只是创建它然后定
  • EntityManager persist() 方法不会将记录插入数据库

    我使用时遇到问题EntityManager persist Object 方法 现在 当我摆脱其他问题时 通过应用程序工作没有异常 但对象没有放入我的数据库中 我的实体类 Entity Table name Chain public cla
  • sails.js 会话 - 记住我的功能

    我一直在尝试使用来实现 Rememberme 功能sails http sailsjs org 我希望会话持续到浏览器关闭为止 但是 如果用户登录时勾选了 Rememberme 复选框 我希望会话持续 30 天 我使用了这里的记住我护照策略
  • 如何使用 JPA 在同一对象上映射父/子关系

    读完这篇文章后JPA映射关系实体parentID https stackoverflow com questions 2743895 jpa map relation entity parentid我尝试将其应用到我的代码中 但这对我不起作
  • Magento 1.9 - 产品未添加到注销用户的购物篮中

    与大多数与 Magento 相关的问题一样 通常需要用头撞墙才能找到解决方案 然而这一次 什么也没有 对于已注销并尝试将商品添加到空购物车的客户 我遇到了一个奇怪的问题 它不适用于某些特定的产品类型 我扩展了购物车控制器以添加对用户输入值的
  • 无需注册 COM 即可与 C# 互操作,可能吗?

    是否可以通过 Dotnet 互操作和 C 使用免注册 COM 如果是这样 如何在 C 项目中添加对 COM 对象的引用 我有一个免费的 ATL COM 服务器 dll 带有嵌入式清单和两个测试客户端 一个是 cpp 另一个是 c cpp 客