C# 在C语言中使用Windows API调用有危险吗#

C# 在C语言中使用Windows API调用有危险吗#,c#,unmanaged,sendmessage,C#,Unmanaged,Sendmessage,我想给文本框添加水印,并找到了几种不同的方法,但我喜欢的一种方法使用SendMessage和外部DLL。然而,我想我在某个地方听说,这样做会导致BSOD,因为它没有得到管理。这是真的,还是只是听到别人说 简短的回答是否定的。它不会导致BSOD,尽管它可能会使您的程序崩溃 WinForms基本上是建立在Windows API调用之上的,因此,如果操作正确,自定义API调用也应该可以正常工作 要记住的另一件事是,如果调用Windows API,可能会产生可移植性问题,例如在移植到Mono时,因为这

我想给文本框添加水印,并找到了几种不同的方法,但我喜欢的一种方法使用SendMessage和外部DLL。然而,我想我在某个地方听说,这样做会导致BSOD,因为它没有得到管理。这是真的,还是只是听到别人说


简短的回答是否定的。它不会导致BSOD,尽管它可能会使您的程序崩溃

WinForms基本上是建立在Windows API调用之上的,因此,如果操作正确,自定义API调用也应该可以正常工作


要记住的另一件事是,如果调用Windows API,可能会产生可移植性问题,例如在移植到Mono时,因为这些DLL很可能不可用。

非托管API可能会使您的程序崩溃,但不会导致BSOD。“这种方式可能会导致BSOD,因为它不受管理”-这不是它的工作方式。。。这一切都不是这样的。请解释您是在哪里听到这一消息的,并用可信的来源支持您的说法,或将其作为谣言予以否认。使用直接Windows API调用会带来可移植性问题(例如,移植到Mono)。在您的情况下,很可能不是问题,但值得注意。@Lucas:是的,但Mono的WinForms实现不是…:)因此,只要您不直接从自己的代码调用Windows API,很多API都可以移植。@Lucastzesniewski:NET是一个标准,而不是一个实现,那么我始终理解Mono和Microsoft版本都是.NET。也许我错了。从这个问题的角度来看,这几乎无关紧要……:)
private const uint ECM_FIRST = 0x1500;
private const uint EM_SETCUEBANNER = ECM_FIRST + 1;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);