我正在将.NET4类库转换为.NET标准2.0,以便可以从.NET4应用程序和.NET6应用程序调用它.这些应用程序仅适用于Windows.

我遇到的一个转换问题是,类库调用了几个WinForms MessageBox.Show()来显示简短的警告消息,并使用OK按钮关闭窗口.

由于.NET Standard 2.0不支持WinForms,复制此功能的最佳方式是什么? (显示一个简单的弹出窗口,其中包含一个短消息字符串和一个确定按钮)

=

编辑:感谢您的回答.PInvoke工作得很完美.这就是我最终学到的课程:

internal class SimpleMsgBox
{
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int MessageBox(int hWnd, String text, String caption, uint type);

    internal static void Show(string message, string title)
    {
        MessageBox(0, message, title, 0);
    }
}

然后可以这样命名:

SimpleMsgBox.Show("an error occurred", "alert");

推荐答案

您可以使用P/Invoke语句调用User32.dll中的MessageBox function,如下所示.

        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
        public static extern int MessageBox(
            IntPtr hWnd,
            string lpText,
            string lpCaption,
            uint uType
            );

要显示MessageBox,请使用所需的参数调用MessageBox函数.要指定父窗口,请传入您自己的应用程序窗口的句柄或IntPtr.Zero以使用桌面窗口.LpText参数是消息文本,lpCaption参数是消息框窗口的标题.请参考有关uTYPE参数的文档,因为有许多选项可用于定制MessageBox的外观和行为.

int returnValue = NativeMethods.MessageBox(
                IntPtr.Zero,
                "Hello!",
                "This is a caption",
                0x0);

Csharp相关问答推荐

访问C#中的数据库字段时获取数据是收件箱错误-为什么?&有效,如果声明不有效

循环访问Android视图中动态创建的子视图

更改对象的旋转方向

EF Core在请求列表时忽略列,但在按ID获取时包含

如何阻止注释被包含在C#release build. exe中

查找表中的模式

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

在静态模式下实例化配置

TCPClient阅读流

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

如何在ASP.NET Core8中启用REST应用程序的序列化?

Docker Container中的HttpRequest后地址不可用

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

在.NET8中如何反序列化为私有字段?

如何在Polly重试策略成功之前将HttpClient请求排队?

Linq SELECT的多条指令

如何在Xamarin.Forms中检索PanGesture事件的位置?

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

在使用.NET EF Core DbContext属性之前,是否应使用null判断