Inno Setup访问冲突中的C#DLL
我试图在我的InnoSetup项目中引用C#DLL。 我需要的是一个带有一个字符串参数和一个字符串返回值的简单函数。 但即使遵循这个例子,并尝试不同种类的编组,我总是以Access Violation结尾。
这是我的C#类 :
public class NKToolbox
{
[DllExport("EncryptPassword", CallingConvention.StdCall)]
static string EncryptPassword([MarshalAs(UnmanagedType.LPStr)] string password)
{
File.WriteAllText(@"C:temptest.txt", password);
return password.Length.ToString();
}
}
我放置了File.WriteAllText
来查看该方法是否被调用。 但不是。 我使用Robert Giesecke的UnmanagedExports软件包。
Inno设置代码 :
function EncryptPassword(pw: WideString): WideString;
external 'EncryptPassword@files:nktoolbox.dll stdcall';
function InitializeSetup: Boolean;
var
str: WideString;
begin
str := EncryptPassword('sdvadfva');
log(str);
result := False;
end;
在行str := EncryptPassword('sdvadfva')
我得到'访问冲突地址......写地址.....'我使用Inno Setup 5.5.9 Unicode。
我已经用其他线程中发现的不同编组语句尝试过了,我用out
关键字尝试过,使用普通string
类型和WideString
无望。
[DllExport("EncryptPassword", CallingConvention.StdCall)]
static string EncryptPassword([MarshalAs(UnmanagedType.LPStr)] string password)
在Delphi代码中,它映射到:
function EncryptPassword(password: PAnsiChar): PAnsiChar; stdcall;
还要注意,C#代码返回一个由CoTaskMemAlloc
调用分配的字符串。 预计您的代码将通过调用CoTaskMemFree
来释放该缓冲区。
您导入此函数的代码尝试将文本视为COM BSTR
字符串。 情况并非如此。
使用COM BSTR
,又名WideString
是一个好主意。 但需要警告的是,C#和Inno之间可能存在不匹配的返回值ABI。 最好使用out
参数。 请参阅为什么WideString不能用作interop的函数返回值?
在你的鞋子里,我会声明C#是这样的:
[DllExport("EncryptPassword", CallingConvention.StdCall)]
static void EncryptPassword(
[MarshalAs(UnmanagedType.BStr)]
string input
[MarshalAs(UnmanagedType.BStr)]
out string output
)
{
output = ...;
}
Inno会是这样的:
procedure EncryptPassword(input: WideString; out output: WideString);
external 'EncryptPassword@files:nktoolbox.dll stdcall';
我对Inno一无所知,因此我的答案部分依赖猜测。
链接地址: http://www.djcxy.com/p/44525.html