编组char函数参数的最佳方法是什么?
问题描述:
令说,鉴于LegacyLib.dll以下特征:编组char函数参数的最佳方法是什么?
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(…)]
魔法可以用来抵制这种魔法?
答
我目前的方法来解决这个问题如下:
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);
}
}
}
...但说实话,感觉有点不必编写代码的额外线的阻力要解决这个问题,我不知道是否有一个实现它的更好方法?