从C+使用C#DLL+;:以字符串作为参数的函数的问题

从C+使用C#DLL+;:以字符串作为参数的函数的问题,c#,c++,com,dll,C#,C++,Com,Dll,从这个例子开始:我尝试在我的C#DLL中添加一个测试函数,它将字符串作为参数。我的C#DLL代码如下: namespace CSharpEmailSender { // Interface declaration. public interface ICalculator { int Add(int Number1, int Number2); int StringTest(string test1, string test2); }; //

从这个例子开始:我尝试在我的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为零。知道我做错了什么吗?

如果不编译这个,interop可能希望字符串是
BSTR
类型。你能试试下面的吗

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


如果不尝试编译该字符串,interop可能希望字符串为
BSTR
类型。你能试试下面的吗

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


您正在使用
==
进行
StringTest
内部的字符串比较,它进行引用比较。这(通常)适用于纯C#,因为所有字符串都是内部字符串,但通过COM传递的字符串的引用将不等于它们在C#中的等效字符串。尝试改用
Equals

您正在使用
=
进行
StringTest
内部的字符串比较,它会进行引用比较。这(通常)适用于纯C#,因为所有字符串都是内部字符串,但通过COM传递的字符串的引用将不等于它们在C#中的等效字符串。尝试使用<代码>等于。

我使用Visual C++ Express 2008——看起来我需要得到平台SDK才使用CCOMBSTR:(不需要,只是为了测试目的,做<代码>::SysLaSoScript(L)你好)。根据您的第二个建议,我得到了以下错误:无法将参数1从“BSTR”转换为“SAFEARRAY*”。有趣的是,我没有建议:(不知道我尝试了一些改变,忘记了重新ReSASM,但现在它与您的第二建议一致,我使用Visual C++快件2008——看起来我需要得到平台SDK,只需要使用CCOMBSTR:(不需要,只是为了测试目的,请做代码>::SysLaSoScript(L)你好)。根据您的第二个建议,我得到了以下错误:无法将参数1从“BSTR”转换为“SAFEARRAY*”。有趣的是,我没有建议:(不知道我是否尝试了一些更改,但忘记了重新命名,但现在它与您的第二个建议一起正常工作了!我不认为是这样的。请看这里:-此运算符是使用Equals方法实现的,这意味着将测试比较符的引用和值相等组合。此运算符执行顺序比较on.我不认为是这样的。请看这里:-此运算符是使用Equals方法实现的,这意味着将测试比较符的引用和值相等性。此运算符执行顺序比较。您是否尝试过调试程序并在
StringTest
函数中设置断点?可以吗检查传入的字符串的值,如果是,它们是什么?您是否尝试过调试程序并在
StringTest
函数中设置断点?是否可以检查传入的字符串的值,如果是,它们是什么?