Member 12712527 Ответов: 1

Как использовать C char* в C#...?


Я написал код как на VC++, так и на C#, но не знаю, как вернуть строку
от C до C#...

Что я уже пробовал:

Код VC++ :-
В Ctest1.h
#include<stdio.h>
#include "pch.h"
#pragma once
class __declspec(dllexport) Ctest1
{
  public:
  Ctest1();
  ~Ctest1();
  char* func();
};

В Ctest1.cpp
#include "pch.h"
#include "Ctest1.h"
char* Ctest1::func()
{
  char sname[] = { "kkk" };
  return sname;
}
Ctest1::Ctest1()
{}
Ctest1::~Ctest1()
{}

В Caller.h
#include "Ctest1.h"
#include "pch.h"
#ifdef __cplusplus
extern "C"
{
#endif
extern __declspec(dllexport) Ctest1* _Create();
extern __declspec(dllexport)void dispose(Ctest1* _pObject);
extern __declspec(dllexport)char* func(Ctest1* _pObject);
#ifdef __cplusplus
}
#endif

В Caller.cpp:-
#include "pch.h"
#include "Caller.h"
Ctest1* _Create()
{
  //Ctest1 c = new Ctest1();
  return new Ctest1();
}
void dispose(Ctest1* _pObject)
{
  if (_pObject != NULL)
  {
    delete _pObject;
    _pObject = NULL;
  }
}
char* func(Ctest1* _pObject)
{
  if (_pObject != NULL)
  {
    char* str = _pObject->func();
    return str;
  }
}

И в коде C# :-
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
  public partial class Form1 : Form
  {
    [DllImport("First.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr _Create();
    [DllImport("First.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void dispose(IntPtr pCtest1);
    [DllImport("First.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr func(IntPtr pTest);
    
    public Form1()
    {
      InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
      IntPtr ptestClass = _Create();
      IntPtr p= func(ptestClass);
      /// Now how to get the string in C-function 
      dispose(ptestClass);
    }
  }
}

Итак, сэр, как получить строку, возвращенную из C++, и сохранить ее в C#

1 Ответов