私はdllで定義されたクラスを持っています。このクラスをインターフェイスでエクスポートします。私はこの dll とクラスを他の Delphi プロジェクトで非常によく使用していますが、このクラスを C# で使用したいのですが、エラーを送信します。
ソース DLL:
type
IMyDate = interface
['{D032F796-167D-4B0D-851D-2AEEA226646A}']
Procedure Analyze_Date(var y:Integer; m,d:Integer); stdcall;
end;
TMyDate = Class(TInterfacedObject, IMyDate)
Public
Procedure Analyze_Date(var y:integer; m,d:Integer); stdcall;
End;
procedure TMyDate.Analyze_Date(var y:Integer; m, d: Integer);
begin
y:= m+d;
end;
Function MyDate:IMyDate; stdcall;
begin
result:= TMyDate.Create;
end;
exports
MyDate;
Delphi の例での単位の使用:
Function MyDate:IMyDate; stdcall; external 'Project11';
implementation
procedure TForm3.Button1Click(Sender: TObject);
var
md:IMyDate;
var y,m,d:Integer;
begin
md:= MyDate;
y:=10;
m:=20;
d:=30;
md.Analyze_Date(y,m,d);
showMessage(intTostr(y));
end;
C# で使用しますが、エラーが発生します。
//[Guid("D032F796-167D-4B0D-851D-2AEEA226646A")]
public interface IMyDate
{
void Analyze_Date(ref int y, int m, int d);
}
[DllImport(
"Project11.dll"
, EntryPoint = "MyDate"
, SetLastError = true
, CallingConvention = CallingConvention.StdCall
, CharSet = CharSet.Unicode)]
public static extern IMyDate MyDate();
private void button9_Click(object sender, EventArgs e)
{
int y, m, d;
IMyDate da;
da = MyDate(); // get error this line
y = 10;
m = 20;
d = 30;
da.Analyze_Date(ref y, m, d);
}
アップデート
答えてくれてありがとう
インターフェイスとクラスに新しい関数を追加しますが、関数は false しか返しません
また、デルファイの私の関数と手順はstdcallであり、C#のインターフェースは正常です!!!
IMyDate = interface
['{D032F796-167D-4B0D-851D-2AEEA226646A}']
Function testing():Boolean; stdcall;
end;
TMyDate = Class(TInterfacedObject, IMyDate)
Public
Function testing():Boolean; stdcall;
End;
function TMyDate.testing(): Boolean;
begin
result:= true;
end;
c#:
[ComImport, Guid("D032F796-167D-4B0D-851D-2AEEA226646A"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyDate
{
bool testing();
}
[DllImport(
"Project11.dll"
, EntryPoint = "CreateMyDate"//"MyDate"
, SetLastError = true
, CallingConvention = CallingConvention.StdCall
, CharSet = CharSet.Unicode)]
public static extern void CreateMyDate(out IMyDate Date);
Boolean b;
b = da.testing(); //this line only return false
if (b)
{
MessageBox.Show("ffff");
}