Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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
创建现有COM对象的新C#版本以在Delphi程序中使用_C#_Delphi_Com_Activex - Fatal编程技术网

创建现有COM对象的新C#版本以在Delphi程序中使用

创建现有COM对象的新C#版本以在Delphi程序中使用,c#,delphi,com,activex,C#,Delphi,Com,Activex,我们遇到了一个小问题,丢失了一些旧ActiveX组件的源代码。我们有一个Delphi7程序,它调用活动X组件。这有点大,不能改变太多。但是,Active X组件中的某些功能需要更新。由于我们一直在将应用程序迁移到C#,因此决定将ActiveX重新作为C#类库 我有一个基本的C#类库来证明这个概念。我可以破解guid和注册表,这样看起来就像旧的一样。如果我看一下旧的和新的类型库,它们基本上是相同的。有几处细微的差别,但我认为不会有什么问题 现在,据我所知,有三种方法可以使用新类库: 通过查找Pro

我们遇到了一个小问题,丢失了一些旧ActiveX组件的源代码。我们有一个Delphi7程序,它调用活动X组件。这有点大,不能改变太多。但是,Active X组件中的某些功能需要更新。由于我们一直在将应用程序迁移到C#,因此决定将ActiveX重新作为C#类库

我有一个基本的C#类库来证明这个概念。我可以破解guid和注册表,这样看起来就像旧的一样。如果我看一下旧的和新的类型库,它们基本上是相同的。有几处细微的差别,但我认为不会有什么问题

现在,据我所知,有三种方法可以使用新类库:

  • 通过查找ProgId延迟绑定。这样行

  • 导入类型库。(项目|导入类型库)此操作正常

  • 作为ActiveX组件导入。这将生成一个tlb文件。这不管用。当我去创建组件时,我得到“不存在这样的接口”。类正在加载到某个点,但尚未完全加载

  • 现在不幸的是,Delphi程序正在使用选项3。所以我必须努力让我的类库在这种情况下工作。你知道我如何克服那个错误吗?我在谷歌上搜索并找到了一些参考资料,但没有说明问题所在

    第二个问题。我应该知道怎么做,因为我做过一次,但我似乎是侥幸。当我在Delphi中时,我会导入ActiveX组件以生成TLB文件。现在,生成的第一个C#类库显示在ActiveX控件列表中,我可以为它创建单元。但是为了测试,我创建了另一个更简单的类库,如果我能让类库显示在ActiveX控件列表中,那么我就不能导入它,那我就完蛋了


    活动X组件的创建单元生成与导入类型库格式不同的TLB.pas格式,并生成我需要的ActiveX格式

    ActiveX控件的作用远不止实现您的接口。它更像是一个TComponent或TWinControl。它要求您实现更多的ActiveX控件接口。通过COM/ActiveX公开的C#对象不是控件,而是一个简单的类


    它不会显示在导入ActiveX控件中,因为它不是ActiveX控件。我认为将您的C#类设置为活动控件是不可行的。

    另一种可能性,尽管可能不是最优雅的,是在Delphi中创建一个新的ActiveX com对象,它反过来通过您已经使用过的任何一种方法调用您的C#类

    由于您声明这是针对现有的Delphi 7应用程序的,因此您可能只想在C#端使用Com互操作,将对象公开为Com可见,然后直接从Delphi 7应用程序使用它


    第一个选项可能允许您对现有应用程序进行最小的更改,但确实添加了一个很可能不需要的附加层

    但我创建的第一个示例确实出现在我的ActiveX控件lsit中。但我不知道它是怎么出现在那里的!这个tlb几乎和原来的tlb完全一样!