我正在尝试升级旧代码以支持 .NET 7 中的最新功能,即
LibraryImport
,但我遇到了其他人似乎没有的错误。我能找到的所有示例都要求该方法同时是 static
和 partial
,但如果没有 extern
,则需要实现。
#if NET7_0_OR_GREATER
[LibraryImport("kernel32")]
public static partial IntPtr LoadLibrary(string fileName);
[LibraryImport("kernel32")]
public static partial IntPtr GetProcAddress(IntPtr module, string procName);
[LibraryImport("kernel32")]
public static partial int FreeLibrary(IntPtr module);
#else
错误如下:“部分方法'IntPtr LoadLibrary(string)'必须有一个实现部分,因为它具有可访问性修饰符。”唯一的建议刚刚删除了
partial
并添加了一个在调用时抛出异常的通用实现.
起初,我以为我遇到了问题,因为我的项目支持多个框架,但错误在新的 .NET 7 控制台应用程序上仍然存在。我什至尝试使用其他 IDE,但没有帮助。
我的代码到底有什么问题?
查看
LibraryImportGenerator
的单元测试,位于 GitHub。
它们表明那些具有
LibraryImport
属性的分部方法将在 partial
类中声明。
partial class NativeExportsNE
{
[LibraryImport(NativeExportsNE_Binary, EntryPoint = "get_variant_bstr_length")]
public static partial int GetVTBStrLength([MarshalAs(UnmanagedType.Struct)] in object obj);
}
您的代码可能如下所示。
partial class NativeMethods
{
[LibraryImport("kernel32", StringMarshalling = StringMarshalling.Utf8)]
public static partial IntPtr LoadLibrary(string fileName);
[LibraryImport("kernel32", StringMarshalling = StringMarshalling.Utf8)]
public static partial IntPtr GetProcAddress(IntPtr module, string procName);
[LibraryImport("kernel32")]
public static partial int FreeLibrary(IntPtr module);
}
另请检查您的 Visual Studio 2022 版本。
在下面的评论中,您说正在使用 Visual Studio 2022 17.2。
某些 .NET SDK 版本需要较新版本的 Visual Studio 和 MSBuild。
NET SDK版本 | 最低 Visual Studio 和 MSBuild 版本 |
---|---|
7.0.200 | 17.4 |