You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
usingSystem.Runtime.InteropServices;varlibraryHandle=NativeLibrary.Load("user32.dll");varfunctionPtr=NativeLibrary.GetExport(libraryHandle,"MessageBoxA");unsafe{// Define a delegate for the MessageBoxW functionvarmessageBox=(delegate* unmanaged[Cdecl]<nint,byte*,byte*,uint,int>)functionPtr;
fixed (byte*p1="Hello World!"u8)
fixed (byte*p2="My Caption"u8){// Call the MessageBoxW functionvarresult=messageBox(0,p1,p2,1);Console.WriteLine(result==1?"OK":"Cancel");}}staticpartialclassLib{[LibraryImport("user32.dll")]publicstaticpartialintMessageBoxA(ninthWnd,ReadOnlySpan<byte>lpText,ReadOnlySpan<byte>lpCaption,uintuType);}
Activity
ufcpp commentedon Jul 25, 2021
#297 (comment)
ufcpp commentedon Sep 29, 2021
https://github.com/dotnet/runtime/blob/e05c631ee62b04d93dfed778abfdada48517ddd7/docs/design/libraries/DllImportGenerator/Compatibility.md
DllImportGenerator は function pointer 前提に作られてそう。
ufcpp commentedon Mar 11, 2022
https://cs.github.com/?scopeName=All+repos&scope=&q=repo%3Adotnet%2Fruntime+%22delegate*%22
やっぱほぼ interop よね。
ufcpp commentedon May 2, 2022
https://gist.github.com/ufcpp/63408fcd6941b42d3d3931612fdce875 ふーん…
ufcpp commentedon Mar 29, 2023
ufcpp commentedon Mar 29, 2023
win32 API を bind して、primitive な型しか使わない限りは別に DllImport, LibraryImport よりも速いとかもなさげ。
速度を理由には使わなさそう。
動的なロードとか、Free したい要件で使うもの?
ufcpp commentedon Mar 29, 2023
dotnet/runtime 内、ちらほら
NativeLibrary.TryGetExport(kernel32, "GetTempPath2W", out IntPtr func)IntPtr pfnGetSystemTime = NativeLibrary.GetExport(kernel32Lib, "GetSystemTimeAsFileTime")ufcpp commentedon Mar 29, 2023
.NET IL の仕様的には .NET Framework 1.0 の頃から関数ポインターの仕様持ってる。
関数ポインターのアドレスを IntPtr で取る手段も同じく 1.0 の頃から、
https://learn.microsoft.com/ja-jp/dotnet/api/system.runtimemethodhandle.getfunctionpointer?view=net-7.0
で取れた。
問題はそれを C# から効率よく invoke する手段がなかったこと。
これも、IL 的には ldftn, ldvirtftn, ldtoken, calli 命令使ってできたけども、C# コンパイラーがこれらの命令を直接生成することはなかった。
(ILEmit すればできた。)
「卵が先か」問題になるけども、効率よく invoke できないから関数ポインターの使い道限られてた。
delegate*記法を使った関数ポインターが C# に導入されたことで、関数ポインターに対してf(x, y, z)みたいなコードが書けるようになって、これが calli 生成するようになった。.NET Core 3.0 で、 NativeLibrary クラスが追加されて、DLL 中の export 関数を関数ポインターで取る手段が入った。
これで、ネイティブDLLを動的にロードして、その中の関数を calli で呼べるように。
ufcpp commentedon Apr 1, 2023
https://ufcpp.net/study/csharp/interop/functionpointer/