目录
例如,WinAPI+DirectX(TerraFX.Interop.Window)和跨平台的Xlib(TerraFX.Interop.Xlib)或xcb(DeafMan1983.Interop.xcb——WIP)任何转换函数都可以使用,轻松编写,类似于浪费长时间使用硬编码函数。
介绍
我想展示一下C#的现代转换函数,如果您使用SDL2(DeafMan1983.Interop.SDL2)/SDL3(DeafMan1983.Interop.SDL3,WIP)或GTK4/5和带有Qt6的纯代码(没有 Qt6框架,只有带有WinAPI和X11、xcb和其他适用于Linux、macOS和Android的窗口系统运行时的硬编码源,还有iOS(我不确定))
背景
由于我正在监督NativeAot使用的dotnet应用程序,例如AppWithPlugins和PaintNet(WIP),并且我有很多关于现代转换函数的工作,例如您在没有固定语句的情况下使用WinAPI没有问题。
使用代码
**新**
char[]、char*、char**、char*[]和char[][]的解释:
char[] StringToCharArray(string intput)它的工作原理就像string.ToCharArray();
string CharArrayToString(char[] ary)它就像new string(char[] ary);
char* StringToCharPointer(string intput)它是使用TerraFX.Interop.Windows非常特别的指针char*,与C/C++示例中的wchar*或者TChar*不同
string CharPointerToString(char* ptr)是一个反向转换器,不同于 C/C++中的std::stringchar** StringArrayToCharDoublePointer(string[] inputs)
就像在C/C++中的wchar** argvstring[] CharDoublePointerToStringArray(char** dblPtr)一样,就像在C/C++中的wchar** argvchar*[] CharDoublePointerToCharPointerArray(char** dblPtr)一样转换为char*[]char** CharPointerArrayToCharDoublePointer(char*[] ptrAry)
转换为char**char[][] CharPointerArrayToCharDoubleArray(char*[] ptrAry)是一个char[]高级数组长度,可以像在任何C/C++中一样处理所有内容。因为我已经看到了char[][]示例2int main(int argc, char** argv) { ... },如Quake 2或Half-Life必须使用char[][]从CommandLine或任何功能,但我将寻找更多的功能。
char*[] CharDoubleArrayToCharPointerArray(char[][] dblAry)就像我在char[][] ....int CharPointerLength(char* ptr)中解释的那样,它是char*的新功能。无需担心并发症/问题!它的工作原理类似于char[]。
例:
string str_1 = "Hello World!";
char* charPtr_1 = StringToCharPointer(str_1);
Console.WriteLine($"Result: Importing string from char {CharPointerToString(charPtr_1)}");
Console.WriteLine($"Length of char*: {CharPointerLength(charPtr_1)}");
结果:
Result: Importing string from char Hello World!
Length of char*: 12
int CharDoublePointerLength(char** dblPtr)不是正常的长度,只是像char[][]数组长度一样。
请不要忘记string[]到char**有问题,因为我试图修复。这似乎是错误的,因为string[]没有正确的数组大小,例如4 =数组的大小,但它需要修复:
[ HELLO ][ HELLO ][ HELLO ]/[ HELLO ] <- It means wrong length。
这就是为什么我们需要解决,如果您添加string.Empty或null作为最后一个长度,那么它将能够正常工作。例:
string[] strings = { "Haha ", "Hehe ", "Hihi ", "Hoho ", "Huhu", string.Empty }; // <- Fix if you don't see last item of array.
char** charDblPtr_1 = StringArrayToCharDoublePointer(strings);
for(int i = 0; i < strings.Length - 1; i++) // Need to -1
{
charDblPtr_1[i] = StringToCharPointer(strings[i]);
Console.WriteLine($"{strings[i]}");
}
charDblPtr_1[strings.Length - 1] = null; // <- Need fix null
int arrayLength = CharDoublePointerLength(charDblPtr_1);
Console.WriteLine($"Length of char**: {arrayLength} ");
结果:
Haha
Hehe
Hihi
Hoho
Huhu
Length of char**: 5
如果您使用char*[]或char**到string[]是可以的,请小心!
示例CharPointerArrayToCharDoublePointer()
char*[] charPtrArrays = new char*[]
{
StringToCharPointer("Bill Gates"), // USA, Ex Microsoft boss
StringToCharPointer("Jeff Bezos"), // USA Amazon boss
StringToCharPointer("Tim Cook"), // USA Apple boss
StringToCharPointer("Thomas Mueller"), // Germany /[ mýler }/, soccer of Bayern Munich
StringToCharPointer("Nils Petersen"), // Germany, ex soccer of SC Freiburg
StringToCharPointer("Christian Streich"), // Germany, ex coacher of SC Freiburg
StringToCharPointer("Juegen Klopp"), // Germany /[ jýken ]/, ex chacher of Liverpool FC
StringToCharPointer("Olaf Scholz"), // Germany, prime minister of Germany
StringToCharPointer("Angela Merkel"), // Germany, ex prime minister of Germany
StringToCharPointer("Jericho Rosales"), // Philippines, player for television
};
char** charDblPtr_2 = CharPointerArrayToCharDoublePointer(charPtrArrays);
for (int i = 0; i < charPtrArrays.Length; i++)
{
Console.WriteLine($"{i + 1} Name: {CharPointerToString(charDblPtr_2[i])}");
}
int arrayLength_2 = CharDoublePointerLength(charDblPtr_2);
Console.WriteLine("Array Length of char*[] {0} ", arrayLength_2);
结果:
1 Name: Bill Gates
2 Name: Jeff Bezos
3 Name: Tim Cook
4 Name: Thomas Mueller
5 Name: Nils Petersen
6 Name: Christian Streich
7 Name: Juegen Klopp
8 Name: Olaf Scholz
9 Name: Angela Merkel
10 Name: Jericho Rosales
Array Length of char*[] 10
以及其他示例CharDoubleArrayToCharPointerArray()
char[][] charArrayArray = new char[][]
{
new char[] { 'H', 'e', 'l', 'l', 'o' },
new char[] { 'W', 'o', 'r', 'l', 'd' },
StringToCharArray("and"),
StringToCharArray("Mars's World")
};
char*[] chardblArray = CharDoubleArrayToCharPointerArray(charArrayArray);
foreach (var charAry in charArrayArray)
{
Console.WriteLine($"CharArray: {CharArrayToString(charAry)}");
}
char[][] chardblArray_2 = CharPointerArrayToCharDoubleArray(chardblArray);
for (int i = 0; i < chardblArray_2.Length;i++)
{
Console.WriteLine($"{i + 1} CharArray: {CharArrayToString(chardblArray_2[i])}");
}
int array_length = CharDoublePointerLength( // <- Length of char double pointer
CharPointerArrayToCharDoublePointer( // <- trying char** from char*[]
CharDoubleArrayToCharPointerArray(chardblArray_2) // <- trying char*[] from char[][]
)
);
Console.WriteLine($"Array Length of char[][] is {array_length}");
结果:
CharArray: Hello
CharArray: World
CharArray: and
CharArray: Mars's World
1 CharArray: Hello
2 CharArray: World
3 CharArray: and
4 CharArray: Mars's World
Array Length of char[][] is 4
这就是char[]、char*、char**、char*[]和char[][]等等......
如果您对使用TerraFX.Interop.Windows感到兴奋,那么您将享受使用charX/charXX和char*和char**长度的新功能,并享受您的开发。
sbyte* <-> string和string <-> sbyte*
SDL2包装器示例(DeafMan1983.Interop.SDL2):
将string转换为sbyte*,并将sbyte*转换为string):
// Example for title in SDL_CreateWindow()
sbyte* title = SBytePointerFromString("HelloSDL");
...
SDL_Window* window = SDL_CreateWindow(title, ... );
或sbyte*到string(string来自sbyte*)。
// Example for printf()
[DllImport("c")]
private static extern int printf(sbyte* fmt);
public static int Printf(sbyte* fmt, params object[] args)
{
string result = StringFromSBytePointer(fmt);
if (result == null)
return 1;
return printf(SBytePointerFromString(string.Format(result, args));
}
sbyte*和string的两种很好的方法,你可以像这样使用。
还有Gtk3/Gtk4的好例子:
string[]到sbyte**(sbyte**来自string[])
static int Main(string[] args)
{
GtkApplication* app = gtk_application_new(SBytePointerFromString("org.gtk.example"),
GApplicationFlags.G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, ACTIVATE, G_CALLBACK
((delegate* <gtkapplication*, void*, void>)&Activate), null);
int argc = args.Length;
sbyte** argv = SByteDoublePointersFromStringArray(args);
int status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
这很棘手,你可以用C/ c++开发,比如用int和char*或char*[]
等来开发c#的main函数。
sbyte**到string[]( string[]s来自byte**)
没有可用的代码。您知道它的工作方式就像共享库示例中的参数/参数:Half-Life Sharp(仍在进行中)。
兴趣点
我觉得这很有趣,因为ClangSharpPInvokeGenerator把const char*或char**变成了sbyte*或sbyte**因为C/C++ <-> C#不一样,但对于WinAPI非常敏感,因为WinAPI不支持sbyte*/sbyte**,只在C/C++中使用类似的char*/char**。
我希望wchat*和TChat*与普通chat*不同,因为wchat表示Windows-Charecter并且只有2个字节。
由于它是敏感的,我需要在char*/char**中修复UTF8或ANSI格式。
更新:char*到字符串,字符串到char*和释放的char*长度
警告:包将移至“DeafMan198.Utilities”
UtilitiesForUTF16 -> char*到string,string到char*和char*(char**到string[]和string[]到char**和更多的将在代码中使用中看到)的长度
UtilitiesForSByte-> sbyte*到string和string到sbyte*(即将到来的sbyte长度)
UtilitiesForByte-> byte*到string和string到byte*(将到来的byte长度)
我已经用char*(UTF16)重新工作了,变成了字符串(UTF8)
示例:对于WinAPI(TerraFX.Interop.Windows)
如何在C#下成功使用WinAPI。
例:
...
static string DesktopAppStr = "DesktopApp";
static string TitleStr = "Windows Desktop Guided Tour Application";
...
HWND hWnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
StringToCharPointer(DesktopAppStr),
StringToCharPointer(TitleStr),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
HWND.NULL,
HMENU.NULL,
hInstance,
null
);
...
这就是WinAPI的全部内容。我很高兴看到中文是否会出现。耶!
如果我发布char*和字符串以及char*的长度的包,请享受您的阅读。
对于byte*<-> string:
byte* StringToBytePointer(string input)
string BytePointerToString(byte* ptr)
int BytePointerLength(byte* ptr)
byte** StringArrayToByteDoublePointer(string[] input)
string[] ByteDoublePointerToStringArray(byte** ptrArray)
Int ByteDoublePointerLength(byte** ptrArray)
sbyte** <-> string:
sbyte* StringToSBytePointer(string input)
string SBytePointerToString(sbyte* ptr)
int SBytePointerLength(sbyte* ptr)
sbyte** StringArrayToSByteDoublePointer(string[] input)
string[] SByteDoublePointerToStringArray(sbyte** ptrArray)
Int SByteDoublePointerLength(sbyte** ptrArray)
char* <-> string:
char* StringToCharPointer(string input)
string CharPointerToString(char* ptr)
int CharPointerLength(char* ptr)
char** StringArrayToCharDoublePointer(string[] input)
string[] CharDoublePointerToStringArray(char** ptrArray)
Int CharDoublePointerLength(char** ptrArray)
历史
我从Ethan Lee的 SDL2-CS 开始。但是他的SDL2-CS不能使用NativeAot。这就是为什么我在DeafMan1983.Interop.SDL2中重新设计了像C/C++那样的完整指针,因为它对NativeAot支持效果很好。新版本带有char*和更多新功能。它也适用于TerraFX.Interop.Windows。
添加遗漏的有关函数的说明。
如果你想花我钱,因为我有很多工作尝试使用string[]和char**进行修复,那就是方式。查看信息 !
对不起,没有PayPal/Skrill:
只有TRX、MATIC或LTC在加密钱包下,因为我必须赚更多的钱。
Nuget画廊
它很快就会到来。(我目前正在工作。对不起,犹豫不决!)
查看Nuget包
dotnet add package DeafMan1983.Utilities
它使用sbyte*<->string,sbyte**<->string[],新的char´*<->string和更多的新...
如果您想查看我的Nuget包,可以访问我的包。
https://www.codeproject.com/Tips/5375957/char-sbyte-byte-and-uint-with-arrays-and-pointers