Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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
转换c++;vb6将COM对象转换为.net 我在C++和VB6中有一个COM对象,所有的东西都是用Visual Studio 2003编译和打包的。C++生成了DLL,VB6为EXE,所以从遗留代码中,我可以调用调用DLL的EXE等等。_C++_Vb.net_Com_Dll_Vb6 Migration - Fatal编程技术网

转换c++;vb6将COM对象转换为.net 我在C++和VB6中有一个COM对象,所有的东西都是用Visual Studio 2003编译和打包的。C++生成了DLL,VB6为EXE,所以从遗留代码中,我可以调用调用DLL的EXE等等。

转换c++;vb6将COM对象转换为.net 我在C++和VB6中有一个COM对象,所有的东西都是用Visual Studio 2003编译和打包的。C++生成了DLL,VB6为EXE,所以从遗留代码中,我可以调用调用DLL的EXE等等。,c++,vb.net,com,dll,vb6-migration,C++,Vb.net,Com,Dll,Vb6 Migration,我需要将这些迁移到VisualStudio2008。不过,我有一些问题 1)我可以编译C++生成DLL(我想可以) 2) VB.Net不再具有将COM/ActviveX生成为VB6的选项,因此不知道 -我试图生成windows exe并调用dll,但它不起作用。我想是因为它有一些COM呼叫 那么,什么是摆脱COM/ActiveX并提供内容的最佳解决方案呢 编译在C++中,在VB.NET中加载引用添加?我试过这个,但是DLL没有加载…………< p> > p>您没有澄清VB代码是进程外的COM服务

我需要将这些迁移到VisualStudio2008。不过,我有一些问题

1)我可以编译C++生成DLL(我想可以) 2) VB.Net不再具有将COM/ActviveX生成为VB6的选项,因此不知道 -我试图生成windows exe并调用dll,但它不起作用。我想是因为它有一些COM呼叫

那么,什么是摆脱COM/ActiveX并提供内容的最佳解决方案呢


编译在C++中,在VB.NET中加载引用添加?我试过这个,但是DLL没有加载…………< p> > p>您没有澄清VB代码是进程外的COM服务器,还是客户机消费C++的进程对象。 如果VB代码是客户端,则可以将其构建为一个VB.NET可执行文件,其中COM引用可以引用到COOP类,或者如果不希望在构建期间注册C++对象,可以使用TybBin工具在类型库中生成一个托管互操作程序集,以从VB.NET代码中引用。 如果VB.Code是进程外COM服务器,则必须使用COMVisible属性标记希望通过COM可信任的类,然后使用RegAsm工具向COM注册程序集

另一种选择是将C++代码编译为托管C++,并将其从VB代码中引用为标准托管程序集。这种方法的优点是,您可以完全绕过COM互操作层,完全留在托管世界中,这有一定的好处。另一方面,有两个缺点——A)你的C++代码只能访问那个特定的客户端,除非你把它放在GAC中,而B)写管理的C++ WIL需要一点RAMPUP。我不认为第一个会影响你,就像在你的场景中,听起来COM只是作为一个方便的方式从VB6代码到更低级别的C++。然而,第二个可能会给你带来一些麻烦

<强> Update <强>:基于您的注释更新,实际上您有一个C++代码,它直接从VB代码中调用,而该代码又是通过其他客户端的COM调用的。


如果确实如此,那么我的建议是将VB6代码重新编译为一个VB.NET(并且您可能需要对代码进行一些更改,因为这两个平台不是完全相同的),并使用COMPECTION作为COM对象公开它,并使用P/JooCK来消耗当前的C++代码。(这与当前VB6代码消耗的方式非常类似)。不需要重新编译C++作为托管C++组件。

< P>您没有明确说明VB代码是进程外的COM服务器,还是客户机消费C++的进程对象。 如果VB代码是客户端,则可以将其构建为一个VB.NET可执行文件,其中COM引用可以引用到COOP类,或者如果不希望在构建期间注册C++对象,可以使用TybBin工具在类型库中生成一个托管互操作程序集,以从VB.NET代码中引用。 如果VB.Code是进程外COM服务器,则必须使用COMVisible属性标记希望通过COM可信任的类,然后使用RegAsm工具向COM注册程序集

另一种选择是将C++代码编译为托管C++并将其从VB代码中引用为标准托管程序集。这种方法的优点是完全绕过COM互操作层并完全留在托管的世界中,这具有一定的完美好处。你的C++代码只对那个特定的客户端是可访问的,除非你把它放在GAC中,而且B)写管理的C++ WIL需要一点RAMPUP。我不认为第一个会影响你,就像在你的场景中,听起来COM只是作为一个方便的方式从VB6代码到更低级别的C++。然而,第二个可能会给你带来一些麻烦

<强> Update <强>:基于您的注释更新,实际上您有一个C++代码,它直接从VB代码中调用,而该代码又是通过其他客户端的COM调用的。


如果确实如此,那么我的建议是将VB6代码重新编译为一个VB.NET(并且您可能需要对代码进行一些更改,因为这两个平台不是完全相同的),并使用COMPECTION作为COM对象公开它,并使用P/JooCK来消耗当前的C++代码。(这与当前VB6代码使用它的方式非常相似)不应该需要重新编译C++作为一个托管C++组件。

ok,你似乎有一点误解。NET是一个完全不同的环境,COM/VB。它们是所谓的非托管代码,而.NET是被管理的。你可以通过一个调用一个到另一个调用使用互操作的东西(并且有很多种类型)。

首先是vb6-要将其转换为.net,您需要重新编码应用程序..net不是VB。尽管语言相似

net不能是活动X,不能只编译C++ dll(com或其他方式进入.NET)。但是C++有一个特殊的版本,叫做托管C++,它位于托管代码和非托管代码之间。 您有以下选项

  • 重新编写VB程序并使用VB.net中的COM互操作访问现有COM对象
  • 重新编写VB程序,并将COM功能(无论是托管C++还是重新编码到VB.NET)完全重译为Net 。
  • 将VB程序保留并将COM功能(或托管C++或重新编码为VB.NET)完全地还原为.NET,并使用.NET的能力来公开COM接口。
  • 别管
  • 好吧,你好像得了sli