我正在尝试使用COM和引用的类型库让我的C#4.0(VS2010)应用与C ++应用交互。
我见过的所有使用第三方库的例子主要包括ActiveX控件或dll,您只需添加引用和创建对象即可。我无法直接创建任何对象(我得到一个错误,说使用界面),我找不到任何会返回界面的东西。
这是一个用于访问加密数据库的安全COM库,在创建实例时需要密码。
我花了很多时间来了解一般需要做什么,但也足以意识到它是模糊的,我不会在合理的时间段内搞清楚。我发现的最接近的例子是非常抽象和无证的。对于那些理解COM和反思并且互操作性很好的人来说,这可能是有用的,但不足以作为我的经验的起点。
我遇到了一种方法,我只有一种方法可以打电话,但我觉得几个月就可以打电话了。
使用VS2005在发布模式下构建C ++应用程序,并成功添加.tlb作为我的C#2010解决方案的参考。 C ++应用程序安装在我的开发机器上。
在对象浏览器中,我可以看到公共类SecureRepositoryClass,SecurityAgentLib的成员,我想要调用方法GetPolicyValue(string,string,string)。这实现了定义GetPolicyValue的ISecureRepository。
我知道有些东西应该返回我可以强制转换为ISecureRepository的引用,然后调用我需要的方法。
我无法弄明白该怎么做才能获得对此的参考。我们的C ++项目(由其他人编写,不幸的是我不是C ++开发人员)使用以下代码(使用在另一个上下文中设置的变量)
HRESULT hr = CoGetClassObject(CLSID_SecureRuntimeAgent, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory2, (void**) &pClf);
if ((SUCCEEDED(hr)))
{
CComBSTR bstrKey = (LPCTSTR)ProduceKey();
hr = pClf->CreateInstanceLic(NULL, NULL, IID_ISecureRuntimeAgent, bstrKey, (void**)&m_pIAPLI);
if ((!SUCCEEDED(hr)))
我搜索了CreateInstanceLic,CoGetClassObject,并且一直在尝试查找C#等价物。
我尝试了几个例子,但没有真正理解它们的意思,很难适应这种特殊情况。
我知道我拥有什么,我需要什么,但不知道如何到达那里。
答案 0 :(得分:1)
IClassFactory2 COM接口似乎没有在标准的运行时可调用包装器中实现,所以看起来你必须以强力的方式执行它并从你的托管中调用Ole32.dll中的unmanged api码。在C#这里http://www.dotnet247.com/247reference/msgs/28/144657.aspx有一个例子。我在这里直接复制该代码犹豫不决,因为没有为该代码指定版权条款。