2010-04-02 75 views
0

令说,鉴于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); 

在这么幼稚的做这件事的问题方式是我们传递给usernamepassword参数的托管字符串可能比数组边界更长,这可能会导致LegacyLib.dll中的缓冲区溢出。

有没有更好的方法来克服这个问题?即是否有任何快速的[MarshalAs(…)]魔法可以用来抵制这种魔法?

回答

1

我目前的方法来解决这个问题如下:

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); 
     } 
    } 
} 

...但说实话,感觉有点不必编写代码的额外线的阻力要解决这个问题,我不知道是否有一个实现它的更好方法?

相关问题