Re: communication between C# dll and C++ dll ???
Thanks for the reply
I forgot to inform that m using VS 2005 (C# dll ) and VS 6.0 for (C++
dll )
On May 7, 3:09 pm, "Giovanni Dicanio" <giovanni.dica...@invalid.com>
wrote:
I uploaded a sample solution on the web, so you can download that file and=
open in VS2008 and study and experiment with it:
http://www.geocities.com/giovanni.dicanio/vc/csharp_mfc.zip
A simple screenshot is here:
http://www.geocities.com/giovanni.dicanio/vc/csharp_mfc.jpg
HTH,
Giovanni
"Giovanni Dicanio" <giovanni.dica...@invalid.com> ha scritto nel messaggio=
news:OTDGKlCsIHA.524@TK2MSFTNGP05.phx.gbl...
<njoycod...@gmail.com> ha scritto nel messaggio
news:00b9e7ea-db4f-41bf-98ae-ea0d142a5099@v26g2000prm.googlegroups.com...=
How do I Communicate between C# module and C++ module
I hav a c# dll and want to pass strings , call methods of this dll in
to a C++ dll (MFC )
(2 way communication between C# dll and C++ dll )
How do I do this ?
Suppose that you have a C# class that has a read-write 'Text' property
which is a String (C# .NET String).
This class is called 'CSharpClass' and is in the namespace TestCSharpLib=
1.
* CSharpClass:
- properties:
+ Text (String) (read/write)
- methods:
+ SayHello
You can use the new marshal library in VS2008 to help you marshal string=
s
between C++ and C#.
Suppose you have an MFC application (.exe) and you want to marshal the
string from C++ (CStringW / const wchar_t *) to C#, and back.
First you must enable CLR support in the MFC .exe.
You can do that selecting the properties menu of your MFC project (right=
click on project item in Solution Explorer, and select 'Properties' in t=
he
popup menu).
Then select 'Configuration Properties'.
Then, in the item 'Common Language Runtime support: ', select the value:=
'Common Language Runtime support (/clr)'
Then you should include the following lines after the normal #include's
lines in the .cpp source file where you are going to call the C# class.
The purpose of these lines is to use the marshal library of VS2008:
<code>
// Use the marshal library in VS2008
#include <msclr/marshal.h>
using namespace msclr::interop;
</code>
At this point, you can use the marshal_as<> template.
I posted a sample code from a project of mine, that does both directions=
marshaling: C++ -> C# and back C# --> C++.
The code is commented, so you can read the comments for each step:
<code>
//
// TEST of string marshaling between C# and C++
//
void CMfcCallsCSharpDlg::OnBnClickedBtnCallCs()
{
// Create an instance of the C# class
// on the managed heap (using gcnew)
TestCSharpLib1::CSharpClass ^ csharpClass = gcnew
TestCSharpLib1::CSharpClass();
// Read user's text from edit control
CStringW strText;
m_txtInput.GetWindowText( strText );
// Prepare marshal context for marshaling string between C# and C=
++
marshal_context ^ marshalCtx = gcnew marshal_context();
//
// Marshal string from C++ (CStringW - const wchar_t *)
// to C# (System::String ^)
//
System::String ^ s = marshalCtx->marshal_as< System::String ^ >=
(
static_cast< PCWSTR >( strText ) );
// Set string property into C# object
csharpClass->Text = s;
// Invoke test method of C# object
csharpClass->SayHello();
//
// Inverse marshaling, from C# to C++
//
// Convert from C# string back to C++ string
CStringW strFromCS;
strFromCS = marshalCtx->marshal_as< PCWSTR >( csharpClass->Text=
);
// Show the string from C#
CStringW strMsg = L"String from C# : ";
strMsg += strFromCS;
AfxMessageBox( strMsg );
// Cleanup marshal context
delete marshalCtx;
}
</code>
Another option to communicate between C# and C++ is to use COM, but I do=
prefer the C++/CLI extensions of VS2008 - I think that it is simpler.
However, if your C++ MFC project is built using Visual C++ 6, you must u=
se
COM, because there is no C++/CLI extension in Visual C++ 6.
(C++/CLI extensions are one of the top reasons to move to VS2008, IMHO.)=
HTH,
Giovanni- Hide quoted text -
- Show quoted text -