Hey experts, i'm trying to achieve the following:
i have an already written c++ class (which i can't touch), it looks like this:
class CCPlus
{
public:
CCPlus();
~CCPlus();
void WriteToLog(char* toWrite);
void setNumber(int num);
void printNumber();
int getNumber();
void setInternalString(char* str);
void printInternalString();
private:
int m_Number;
CSTRHolder* m_holder;
};
class CSTRHolder
{
public:
CSTRHolder(void);
~CSTRHolder(void);
void setString(char* str);
char* getCopyOfString();
private:
char* m_str;
};
Then i want to create a c++ project that does something like that:
void main()
{
CCPlus* p = new CCPlus();
p->setNumber(10);
int result = MyManagedClass::DoOperation(&p);
}
lets say i have in C# something like this:
namespace ManagedDotnet
{
public class MyManagedClass
{
public static int DoOperation(CCPlusWrapper p)
{
Console.Writeline(p.getNumber());
p.setInternalString("Hello");
p.printInternalString();
return 0;
}
}
}
i've created a project in c++/CLI that suppose to wrap the unmanaged class:
#pragma once
using namespace System;
class CCPlus;
public ref class Bridger
{
public:
Bridger(CCPlus* myUnmanaged);
~Bridger();
void WriteToLog(String^ toWrite);
void setNumber(int num);
void printNumber();
int getNumber();
void setInternalString(String^ str);
void printInternalString();
private:
CCPlus* m_pUnmanaged;
};
#include "stdafx.h"
#include "MyBridge.h"
#include <stdio.h>
#include "CPlus.h"
#include <vcclr.h>
#include <iostream>
using namespace std;
using namespace System;
Bridger::Bridger(CCPlus* myUnmanaged)
:m_pUnmanaged(NULL)
{
this->m_pUnmanaged = myUnmanaged;
}
Bridger::~Bridger()
{
}
void Bridger::WriteToLog(String^ toWrite)
{
pin_ptr<const wchar_t> ptr = PtrToStringChars(toWrite);
m_pUnmanaged->WriteToLog((char*)static_cast<const wchar_t*>( ptr ));
}
void Bridger::setNumber(int num)
{
m_pUnmanaged->setNumber(num);
}
void Bridger::printNumber()
{
m_pUnmanaged->printNumber();
}
int Bridger::getNumber()
{
return m_pUnmanaged->getNumber();
}
void Bridger::setInternalString(String^ str)
{
pin_ptr<const wchar_t> ptr = PtrToStringChars(str);
m_pUnmanaged->setInternalString((char*)static_cast<const wchar_t*>( ptr ));
}
void Bridger::printInternalString()
{
m_pUnmanaged->printInternalString();
}
But now, i need to somehow create this wrapper in C++, pass the unmanaged object, then call another C# DLL, and pass that wrapper to there?
or my direction is wrong?
i'm trying to avoid COM by the way.
thanks!