![](/img/trans.png)
[英]WPF AutoCompleteBox binding .Text with Mode=TwoWay not working - .NET4.0
[英]DllImport attribute with CharSet not working on .NET4.0
我正在嘗試使用DllImport在C#代碼中使用SHGetFileInfo方法。
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
現在,不同的點網框架具有不同的行為。 如果我在具有4.5框架的計算機上運行應用程序,則該應用程序運行良好。 但是,如果在具有Framework 4.0的計算機上運行相同的應用程序,則會崩潰。
如果從DllImport屬性中刪除字符集,則應用程序可以在4.0和4.5框架上正常運行。
現在,MSDN談到了其對不同框架的支持。
.NET Framework受以下版本支持:4.5、4、3.5、3.0、2.0、1.1、1.0
.NET Framework客戶端配置文件受以下版本支持:4、3.5 SP1
可移植類庫受以下版本支持:可移植類庫
Windows Store應用程序的.NET受Windows 8支持
為什么它不能在帶有4.0框架的計算機上運行?
這是完整的代碼:
[StructLayout(LayoutKind.Sequential)]
internal struct SHFILEINFO
{
public IntPtr hIcon;
private IntPtr iIcon;
private uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
private string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
private string szTypeName;
};
internal static class SafeNativeMethods
{
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
}
public IconHelperClass
{
var shinfo = new SHFILEINFO();
SafeNativeMethods.SHGetFileInfo(iconPath, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), flag);
}
iIcon
應該是一個int
,而不是IntPtr
:
[StructLayout(LayoutKind.Sequential)]
internal struct SHFILEINFO
{
public IntPtr hIcon;
private int iIcon;
private uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
private string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
private string szTypeName;
};
您可能會看到的差異是由於AnyCPU
的更新默認編譯選項顯示為“ prefer 32-bit” 。 因此4.5代碼可能以32位運行,其中IntPtr
和int
的大小相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.