使用C ++中的C#DLL:带有字符串作为参数的函数的问题

时间:2010-06-21 03:30:44

标签: c# c++ com dll

从这个例子开始:http://support.microsoft.com/kb/828736我试图在我的C#DLL中添加一个测试函数,它以字符串作为参数。我的C#DLL代码如下:

namespace CSharpEmailSender
{
   // Interface declaration.
   public interface ICalculator
   {
       int Add(int Number1, int Number2);
       int StringTest(string test1, string test2);
   };

// Interface implementation.
public class ManagedClass : ICalculator
{
    public int Add(int Number1, int Number2)
    {
        return Number1 + Number2;
    }

    public int StringTest(string test1, string test2)
    {
        if (test1 == "hello")
            return(1);

        if (test2 == "world")
            return(2);

        return(3);
    }
}

然后我使用regasm注册此DLL。我在我的C ++应用程序中使用它,如下所示:

using namespace CSharpEmailSender;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
ICalculatorPtr pICalc(__uuidof(ManagedClass));

long lResult = 0;
long lResult2 = 0;

pICalc->Add(115, 110, &lResult);
wprintf(L"The result is %d", lResult);

pICalc->StringTest(L"hello", L"world", &lResult2);
wprintf(L"The result is %d", lResult2);

// Uninitialize COM.
CoUninitialize();

return 0;

}

运行此命令后,lResult是正确的(值为225),但lResult2为零。知道我做错了吗?

2 个答案:

答案 0 :(得分:0)

不试图编译它,也许interop期望字符串是BSTR类型。你能试试以下吗?

pICalc->StringTest(CComBSTR(L"hello"), CComBSTR(L"world"), &lResult2);

OR

pICalc->StringTest(::SysAllocString(L"hello"), ::SysAllocString(L"world"), &lResult2); 

答案 1 :(得分:0)

您在==内使用StringTest进行字符串比较,这会进行参考比较。这通常在纯C#中工作,因为所有字符串都是实例化的,但通过COM传递的字符串是引用 - 等于它们在C#中的等效字符串。请尝试使用Equals