Я пытаюсь вызвать код C# из C++. Поэтому я выбрал способ COM Interop. Теперь у меня есть C# код:вызов C# из C++, возвращаемое значение
namespace ToBeCalled
{
[Guid("9329feaf-b293-4093-a7d8-6128f52b30a6")]
[ComVisible(true)]
public interface IInterface
{
int Write(string toWrite);
}
}
namespace ToBeCalled
{
[Guid("e4105e40-2d6b-4b7c-ae42-d2f9c405a2a0")]
[ComVisible(true)]
public class ClassYouWantToUse : IInterface
{
public int Write(string toWrite)
{
System.Console.WriteLine(toWrite);
return 1;
}
}
}
и С ++ код
#import "...\\ToBeCalled.tlb"
int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// Create the interface pointer.
ToBeCalled::IInterfacePtr piTest(__uuidof(ToBeCalled::ClassYouWantToUse));
long lResult = 0;
// Call the Add method.
piTest->Write("hi", &lResult);
wprintf(L"The result is %d\n", lResult);
// Uninitialize COM.
CoUninitialize();
return 0;
}
Когда я пытаюсь это компиляция, конечно, говорит, что запись не принимает 2 аргумента. Я видел MSDN, где у них есть пример, похожий на этот, и они принимают возвращаемое значение таким образом. Итак, мой вопрос: как я могу получить возвращаемое значение функции? Когда я обновляю звонок до
piTest->Write("hi");
, поскольку выполнение не выполняется из-за необработанного исключения. Когда я попробовал этот пример, не возвращая значение, поэтому объявление возвращаемого значения для метода является недействительным, чем все работает нормально.
Я обнаружил, что нужно добавить параметр в C#, а затем я могу использовать второй аргумент для функции, которая будет иметь значение результата. Итак, для Int проблема решена, но как я могу отправить такую строку? –
Вы должны иметь возможность нормально возвращать значение, а не через параметр '[out]'. Что именно исключение? Вы отлаживали управляемый вызов? –