【发布时间】:2012-06-23 22:15:15
【问题描述】:
我对如何做到这一点有点迷惑。我已经按照Best way to use a VB.NET class library from a C++ DLL? 上的说明进行操作,但是对于 VB,我不知道我是否掌握了 VB 部分,更不用说 C++了。如果有人可以在这里帮助我,我会为了后代更正下面的代码!
他们是:VB优先;该项目是一个类库,除了在项目属性中打开“Register for COM interop”外,所有设置都是默认设置。
Public Class Class1
Public Sub New()
'do stuff
End Sub
Public Sub increment()
'do stuff
End Sub
End Class
这里是 C++,它是一个控制台应用程序,开启了 CLR 支持:
#include <iostream>
#import "..\ClassLibrary1\bin\Debug\ClassLibrary1.tlb" raw_interfaces_only
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "hello world" << endl;
HRESULT hr = CoInitialize(NULL);
long lResult = 0;
Class1 c1; //compiler fails on this, doesn't know what Class1 is
c1.increment();
//wait for console key press then exit
char x;
cin >> x;
CoUninitialize();
return 0;
}
具体问题:
- VB 是否正确?我需要向它添加任何类似接口的东西吗?
- 假设我想通过 COM 而不是 C++/CLI 调用它,我该怎么做。 (这似乎是合乎逻辑的选择,因为客户端已经通过 COM 调用了其他东西;但是,我不确定从哪里获取 IDispatch 指针,在我的其他代码中它是由客户端传递给我的)。
- 如果我走 C++/CLI 路线,在从玩具项目升级到实际实现时,这意味着将我现有的 C++ 代码从“不支持 clr”更改为“/clr” - 这可能会破坏它吗?
【问题讨论】:
-
您真的想要在您的项目中使用 .NET 还是使用原生代码?
-
你不是很亲密。使用/clr 编译时使用#import 没有意义,直接使用该类即可。您必须在学习如何编写 COM 代码或学习如何编写 C++/CLI 代码之间做出选择。
-
你尝试#import的no_namespace了吗?
-
@SideshowBob,那么您应该考虑研究什么是 C++/CLI 以及如何将其应用到您的任务中。