Вы можете просто передать строку C # обратно в C ++ и строку C ++ в C #.Требование заключается в том, что строка является Unicode, а метод выделения - SysAllocString, а не malloc.Любую ASCII-строку, которую нужно преобразовать в Unicode.
const wchar_t* theString = L"hello";
BSTR bstr = SysAllocString(theString);
DoSomething(bstr);
SysFreeString(bstr);
И это для регистрации C # dll
Assembly asm = Assembly.LoadFile (@"c:\temp\ImageConverter.dll");
RegistrationServices regAsm = new RegistrationServices();
bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);
И это для преобразования Unicode в ASCII и наоборот.
inline BSTR Cstring2VBstring(char *szString)
{
WCHAR* res = NULL;
BSTR bs;
DWORD n;
char *sz = NULL;
if (*szString && szString)
{
sz = strdup(szString);
n = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, -1, NULL, 0);
if (n)
{
res = (WCHAR*) malloc(n * sizeof(char) );
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, -1, res, n);
}
}
bs = SysAllocString( (const OLECHAR*) res);
free(sz);
return bs;
}
// C String to BSTR conversion (2)
BSTR Cstringn2VBstring(char *szString, int dwSize)
{
WCHAR* res = NULL;
BSTR bs;
DWORD n = (DWORD) dwSize;
char *sz = NULL;
if (*szString)
{
sz = (char*) malloc(dwSize);
memcpy(sz, szString, dwSize);
n = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, n, NULL, 0);
if(n)
{
res = (WCHAR*) malloc(n * sizeof(char) );
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sz, -1, res, n);
}
}
bs = SysAllocStringLen( (const OLECHAR*) res, n);
free(sz);
return bs;
}
И код .NET:
Namespace TestLibrary2
' Interface declaration. '
Public Interface ICalculator
Function Add(ByVal Number1 As Integer, ByVal Number2 As Integer) As Integer
Function Subtract(ByVal Number1 As Long, ByVal Number2 As Long) As Long
Function ReturnValue() As String
Function Concat(ByVal Number1 As String, ByVal Number2 As String) As String
Sub Concat2(ByVal Number1 As String, ByVal Number2 As String)
Function isTrue(ByVal bInputvalue As Boolean) As Boolean
Function isTrue2(ByRef bInputvalue As Boolean) As Boolean
End Interface
' Interface implementation. '
Public Class ManagedClass
Implements ICalculator
Public Function Add(ByVal Number1 As Integer, ByVal Number2 As Integer) As Integer Implements ICalculator.Add
Return Number1 + Number2
End Function
Public Function Subtract(ByVal Number1 As Long, ByVal Number2 As Long) As Long Implements ICalculator.Subtract
Try
System.IO.File.WriteAllText("c:\temp\subtract.txt", "Subtracted: ")
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return Number1 - Number2
End Function
Public Function Concat(ByVal Number1 As String, ByVal Number2 As String) As String Implements ICalculator.Concat
Try
System.IO.File.WriteAllText("c:\temp\Concat.txt", "Nummer1: " + Number1 + vbCrLf + "Nummer2:" + Number2)
Catch ex As Exception
MsgBox(ex.Message)
End Try
Dim strReturnValue As String = Number1 + Number2
Return strReturnValue
End Function
Public Sub Concat2(ByVal Number1 As String, ByVal Number2 As String) Implements ICalculator.Concat2
Console.WriteLine("moo")
End Sub
Public Function ReturnValue() As String Implements ICalculator.ReturnValue
Dim x As String = "moooooo"
Return x
End Function
Public Function isTrue(ByVal bInputvalue As Boolean) As Boolean Implements ICalculator.isTrue
If bInputvalue = True Then
Return True
End If
Return False
End Function
Public Function isTrue2(ByRef bInputvalue As Boolean) As Boolean Implements ICalculator.isTrue2
If bInputvalue = True Then
Return True
End If
Return False
End Function
End Class
End Namespace
Редактировать: Смотрите здесь для более подробной информации:
http://support.microsoft.com/kb/828736
http://msdn.microsoft.com/en-us/library/ms734686.aspx