智慧土狼 2018-10-24 01:47 采纳率: 50%
浏览 912

C#调用Delphi dll文件问题

最近手头一个项目,需要用到C#调用Delphi写出的dll文件(调用的是modelDLL.dll,但是该dll文件还需要另外一个borlndmm.dll文件支持,调用的时候已经把这两个dll文件放到debug目录下了),直接附上相关代码:

Delphi相关源码:

type
    TCharStr=array[0..599] of char;

用Delphi写的直接调用可运行,代码如下:

procedure TMainDLLForm.PedBitBtnClick(Sender: TObject);
var
  fileName:TCharStr;
begin

        OpenDataFileDlg.InitialDir:= GetCurrentDir;
        OpenDataFileDlg.Title:='加载模型文件';
        OpenDataFileDlg.Filter := '定量模型[*.mdl]|*.mdl|定性模型[*.mdr]|*.mdr';
        if OpenDataFileDlg.Execute then
        begin
           StrPCopy(FileName,OpenDataFileDlg.FileName);
           tmpD:=NIRSAModelForPred(graphyData,dataLength,FileName,targetName);
        end;  
       if compareText(fileExt,'.MDR')=0 then
       begin
         memo1.Lines.Add('定性模型: '+ExtractFileName(FileName));
         memo1.Lines.Add(Format('预测结果: %10s:%0.0f',[targetName,tmpD]));
       end;
            memo1.Lines.Add('--------------');
            memo1.Lines.Add(trim(NIRSAPretreatInfor(FileName)));//调用该函数
            memo1.Lines.Add('--------------');
            memo1.Lines.Add(trim(NIRSAModelInfor(FileName)));
end;

而我现在用C#调用出现"尝试读取或写入受保护的内存。这通常指示其他内存已损坏"的错误,代码如下所示:

 [MarshalAs(UnmanagedType.LPStr, SizeConst = 600)]
        public string fileName;

        [DllImport(@"modelDLL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.LPStr, SizeConst = 600)]
        public static extern string NIRSAPretreatInfor(ref string fileName);

        private void preCalcButton_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Multiselect = false;
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                fileName = dialog.FileName;
                string result = NIRSAPretreatInfor(ref fileName);
                modelInfoTextBox.Text = result;
            }                       
        }

该段代码主要参考Stack Overflow的一些解决方案,地址:链接,现在解决不了,没有C币了,请大神支支招,谢谢!

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-10-24 04:43
    关注

    [MarshalAs(UnmanagedType.LPStr, SizeConst = 600)]
    public string fileName;

    这个换成
    public StringBuilder fileName = new StringBuilder(600);

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题