使用新的 .NET LibraryImport 属性时出现意外编译器错误

问题描述 投票:0回答:1

我正在尝试升级旧代码以支持 .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,但没有帮助。

我的代码到底有什么问题?

c# .net compiler-errors interop .net-7.0
1个回答
0
投票

查看

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 7 SDK 的版本要求

某些 .NET SDK 版本需要较新版本的 Visual Studio 和 MSBuild。

NET SDK版本 最低 Visual Studio 和 MSBuild 版本
7.0.200 17.4
© www.soinside.com 2019 - 2024. All rights reserved.