无法加载在托管c ++类中使用字符串,该类从C#调用导致由'mydll'导入的过程

时间:2017-11-10 15:17:25

标签: c# c++ c++-cli

我正在构建一个C#应用程序,它使用来自非托管c ++ dll的类。 我在非托管dll周围创建了一个托管C ++包装器DLL。当我在非托管类中使用std :: string时,运行程序时会出现未处理的异常。例外情况是“无法加载'mydll'导入的过程”。下面是示例代码。当我从非托管头文件中删除std :: string时一切正常。 我正在使用VS2015,希望任何人都可以帮助我解决我的错误。

问候

萨姆

非托管c ++头文件:

class __declspec(dllexport) Student
{
private:
    char *_fullname;
    double _gpa;
    std::string _name2;
public:     
    Student(char *name, double gpa);
        ~Student();
        double getGpa() const;
        char *getName() const;          
};

非托管c ++文件

#include "unman_class.h"
#include <cstring>

Student::Student(char* name, double gpa)
{
    _fullname = new char[strlen(name + 1)];
    strcpy(_fullname, name);
    std::string klaas = "test";
    //_name2 = name;
    _gpa = gpa;
}

Student::~Student()
{
    delete[] _fullname;
}

double Student::getGpa() const
{
    return _gpa;
}

char* Student::getName() const
{
    return _fullname;
}

托管c ++头文件

using namespace System;
#include "..\\unmanaged_dll\unmanaged_dll\unman_class.h"

namespace man_dll {

    public ref class man_class
    {
    private:
        Student *_stu;
    public:
        man_class(String ^fullname, double gpa)
        {
            _stu = new Student((char *)
                System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(
                    fullname).ToPointer(),
                gpa);
        }
        ~man_class()
        {
            delete _stu;
            _stu = 0;
        }

        property String ^Name
        {
            String ^get()
            {
                return gcnew String(_stu->getName());
            }
        }
        property double Gpa
        {
            double get()
            {
                return _stu->getGpa();
            }
        }
    };
}

C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using man_dll;
namespace test_program
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new man_class("test",10);
            Console.WriteLine(test.Name);
            Console.WriteLine(test.Gpa);
            Console.ReadLine();
        }
    }
}

0 个答案:

没有答案