假设给定LegacyLib.dll中的以下签名:
int Login(SysInst *inst, char username[8], char password[6]);在C#中封送此函数的简单方法是:
[DllImport("LegacyLib.dll", CharSet=CharSet.Ansi)]
public static extern int Login(ref SysInst inst, string username, string password);这样做的问题是,我们传递给username或password参数的托管字符串可能比数组边界更长,这可能会导致LegacyLib.dll中的缓冲区溢出。
有没有更好的方法来克服这个问题?也就是说,有没有什么快速的[MarshalAs(…)]魔法可以用来解决这个问题呢?
发布于 2010-04-02 18:53:27
我目前解决这个问题的方法如下:
public class LegacyLibWrapper {
// Don't expose the function...
[DllImport("LegacyLib.dll", EntryPoint = "Login", CharSet = CharSet.Ansi)]
static extern int UnmanagedLogin (ref SysInst inst, string username, string password);
// ... we write a proxy function that does the truncation to passed to LegacyLib
public static int Login(ref SysInst inst, string username, string password)
{
return UnmanagedLogin(inst, Truncate(username, 7), Truncate(password, 5));
}
// A utility function to do string truncation
private function Truncate(string originalString, int maxLength)
{
if (originalString.Length < maxLength)
{
return originalString;
}
else
{
return originalString.Substring(0, maxLength);
}
}
}..。老实说,不得不写额外的代码来解决这个问题,我觉得有点拖累,我想知道有没有更好的方法来实现它?
https://stackoverflow.com/questions/2565020
复制相似问题