读书人

Cannot marshal amp;#x27;return valueamp;#

发布时间: 2012-12-19 14:13:15 作者: rapoo

Cannot marshal 'return value': Invalid managed/unmanaged type combination.
VS2010-C#引用delphi6下编译的dll文件,读出byte[]报错“Cannot marshal 'return value': Invalid managed/unmanaged type combination.”
delphi6下编译的dll文件 源码如下:


library dataoutdll;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, DBClient, StdCtrls, Provider;

type
byteBuffer = array[0..1024] of byte;
var
mydataset:tclientdataset;
mydatasource:tdatasource;
myprovider: tdatasetprovider;
myquery:tadoquery;
sqlcmd:TStringList;

ms1,ms2,ms3:TMemoryStream;
buf: bytebuffer;
{$R *.res}
function getbytes():bytebuffer;stdcall;
begin
ms1:=TMemoryStream.Create;
ms2:=TMemoryStream.Create;
ms3:=TMemoryStream.Create;


mydataset:=tclientdataset.Create(nil);
mydatasource:=tdatasource.Create(nil);
myprovider:=tdatasetprovider.Create(nil);
myquery:=tadoquery.Create(nil);
sqlcmd:=tstringlist.Create;

sqlcmd.Add('select * from trequestprice');
myquery .ConnectionString :=
'Provider=SQLNCLI.1;Password=qqqqqq;Persist Security Info=True;Us' +
'er ID=sa;Initial Catalog=HSEms;Data Source=.' ;
myquery .CursorType := ctStatic ;
myquery.SQL.AddStrings(sqlcmd) ;
myquery.SQL.Strings [0];
myquery .Active := True;

myprovider.DataSet :=myquery;
mydataset.SetProvider(myprovider) ;
mydataset.Active := True ;
mydatasource.DataSet := mydataset;

mydataset.SaveToStream(ms3);
ms3.Position :=0;

FillChar(buf,1025,0);
ms3.Read (buf,sizeof(buf));
ms3.Position :=0;
result:=buf;
end;
Exports
getbytes;

begin
end.

代码功能:读取表trequestprice到内存buf中,作为dll的返回值吐出给C#。

VS2010-C#下调用该dll的代码如下:

[DllImport("dataoutdll.dll", EntryPoint = "getbytes", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern byte[] getbytes();


private void button1_Click(object sender, EventArgs e)
{

try
{
byte[] mybt = new byte[1024];
mybt = getbytes();//程序执行到这里报错
}
catch (Exception ex)
{ MessageBox.Show(ex .Message ); }


}


错误提示为:Cannot marshal 'return value': Invalid managed/unmanaged type combination.

请问各位:delphi6编译下的dll中的array[0..1024] of byte 跟C#下的byte[1024],在内存上是等效的吗?


如何解决这个错误?
在线等。
谢谢
[解决办法]
可以确定,数据已经到了buf中,并且没有填满1024.空余为全部填写0;
老是提示托管/非托管 类型不匹配,那谁要跟谁才能匹配呢?


[解决办法]
null

读书人网 >.NET

热点推荐