簡體   English   中英

具有CharSet的DllImport屬性在.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框架上正常運行。

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset(v=vs.110).aspx

現在,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位運行,其中IntPtrint的大小相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM