在堆上的dll中创建一个对象以用于其他dll调用

时间:2018-04-04 13:16:54

标签: c# c++ dll heap void-pointers

背景

我有一个c#程序调用包含代码的c ++ dll来创建模型(Net类型)并使用该模型来评估图像。由于dll函数当前包含加载模型的代码,因此运行此函数所花费的时间太长,无法用于评估实时订阅源的任务。

我想只需要从dll调用创建一次模型,然后将指向模型的指针传递给evaluate函数,从而消除从文件加载模型的开销。

尝试

我试图创建一个传递void **的函数,在堆上创建一个模型并将传递的void **指向它。这将允许我将指针传递给dll中的其他函数,并从堆内存中创建一个模型对象。

我无法让这个工作,虽然在我看来它应该是可能的,但我不确定它是否可以。

有关如何解决此问题或如何修复我的代码的任何建议将不胜感激,谢谢。

错误

尝试在“loadNet()”

读取或写入受保护的内存

c ++ / dll code

void loadNet(void **np)
{
    String modelFile = "graph.pb";
    Net *net;
    net = (Net *)malloc(sizeof(Net));
    *net = readNetFromTensorflow(modelFile)

    *np = &net;
}

extern "C"{
    DLLEXPORT void loadNet(void **);
}

c#代码调用dll

[DllImport("Project5.dll")]
public static extern unsafe void loadNet(void **np);

static void Main(string[] args)
{
    unsafe
    {
        void *np;
        loadNet(&np);

        Bitmap img = (Bitmap)Image.FromFile("2.png");

        BitmapData bmpData = img.LockBits(new Rectangle(0,0,img.Width, 
                             img.Height),ImageLockMode.ReadWrite, 
                             img.PixelFormat);
        Results results = evalImgGest2(bmpData.Scan0,&np);
        img.UnlockBits(bmpData);

        Console.WriteLine(results.five);
        Console.WriteLine(results.fist);
        Console.WriteLine(results.index);
    }         
}

更新

net = (Net *)malloc(sizeof(Net)); // is causing error 
Net *net = new Net(); // replacing with this removes error 

0 个答案:

没有答案