从C+调用C#dll+;使用CoCreateInstance

从C+调用C#dll+;使用CoCreateInstance,c#,c++,com,comvisible,C#,C++,Com,Comvisible,MyProjectAaC类库,包含一个类: namespace myLib { // Interface declaration. [Guid("Some GUID")] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface ICsClass { [DispId(1)] int Add(int Number1, int Number2);

MyProjectAa
C
类库,包含一个类:

  namespace myLib
  {
    // Interface declaration.
    [Guid("Some GUID")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ICsClass
    {
        [DispId(1)]
        int Add(int Number1, int Number2);
    };

    [Guid("Some GUID")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("myLib.CsClas")]       
    public class CsClas : ICsClass
    {
         public int Add(int a, int b)
        {
            return a + b;
        }
    }
}
我已经使用
VS2010
检查了
Register for com interop
,它为我生成了
dll
tlb
文件,直到现在还可以

MyProjectBa
Win32 Dll
应用程序,带有单个
cpp
文件:

    #import "MyLib.tlb" raw_interfaces_only
    using namespace MyLib;

#ifdef __cplusplus
extern "C"{
#endif
    __declspec(dllexport) long Add(int a,int b)
    {
        CoInitialize(NULL); 
        long lResult = 0;       
        // Use Smart pointer
        CComQIPtr <ICsClass> spCoClass;
        if (SUCCEEDED (spCoClass.CoCreateInstance(L"myLib.CsClas")))
        {
            spCoClass->Add(a,b,&lResult);   
            wprintf(L"The result is %d\n", lResult);
            std::cout << "#"+lResult << '\n'; 
        }
        CoUninitialize();
        return lResult;
    }
#ifdef __cplusplus
}
#endif
从未通过,可能是什么问题,它没有正确地重新注册吗


请提供帮助。

编写的代码无法为您提供诊断故障的好方法。改为这样写:

    HRESULT hr = spCoClass.CoCreateInstance(L"myLib.CsClas");
    if (SUCCEEDED(hr)) {
       // etc..
    }

常见错误代码为0x80040154,“未注册类”。等等。

你从CoCreateInstance得到了什么hresult?有错误消息吗?@MatthewWatson:根本没有错误消息。@doctorlove:Which
hresult
?@user1042031他是指CoCreateInstance()的返回值是的,我得到了相同的错误:
0x80040154
。。。但我可以在注册表中看到我的GUID?我知道了,我必须为64位构建并注册com,因为我调用的Dll是64位的。
    HRESULT hr = spCoClass.CoCreateInstance(L"myLib.CsClas");
    if (SUCCEEDED(hr)) {
       // etc..
    }