KO CSharp Keyword unmanaged function pointer calling convention - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C#: unmanaged โ€” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ํ˜ธ์ถœ ๊ทœ์น™

ํ•ธ๋“œ๋ถ C# ยท ์‹ค์šฉ ๊ฐ€์ด๋“œ

Delegate* ์œ ํ˜•์˜ unmanaged๋Š” ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํ˜ธ์ถœ ๊ทœ์น™์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์ด ์—†์œผ๋ฉด ํ”Œ๋žซํผ ๊ณ„์•ฝ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Cdecl์€ ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UnmanagedCallersOnly์ด ํฌํ•จ๋œ ์ •์  C# ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜ ๊ด€๋ฆฌ ํ˜ธ์ถœ ๋Œ€์‹  ํ˜ธํ™˜๋˜๋Š” ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ (Example.cs)

์ด ์˜ˆ์ œ๋ฅผ Example.cs๋กœ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ณ  ์ด ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ์˜ˆ์ œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”.

Example.cs:

// PROJECT-EXAMPLE
unsafe
{
    delegate* unmanaged[Cdecl]<int, int> twice = &Tools.Twice;
    System.Console.WriteLine(twice(4));
}
static class Tools { [System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = new[] { typeof(System.Runtime.CompilerServices.CallConvCdecl) })] public static int Twice(int value) => value * 2; }

ํ”„๋กœ์ ํŠธ์—์„œ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. ํฌ์ธํ„ฐ๋Š” ํ‘œ์‹œ๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ:

8

ํ†ต์‚ฌ๋ก 

delegate* unmanaged<int, int> operation = &Transform;
delegate* unmanaged[Cdecl]<int, int> callback = &TransformCdecl;

๋น„๊ด€๋ฆฌํ˜• ํ”Œ๋žซํผ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ํ†ตํ™”

ํŒŒ์ผ Example.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <LangVersion>14.0</LangVersion>
    <Nullable>enable</Nullable>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

</Project>

ํŒŒ์ผ Program.cs:

using System;
using System.Runtime.InteropServices;

internal static unsafe class Program
{
    public static void Main()
    {
        delegate* unmanaged<int, int> doubleValue = &DoubleValue;
        Console.WriteLine(doubleValue(12));
    }
    [UnmanagedCallersOnly]
    private static int DoubleValue(int value) => value * 2;
}

๊ฒฐ๊ณผ:

24

๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋œ Cdecl ๊ณ„์•ฝ์ด ํฌํ•จ๋œ ์ฝœ๋ฐฑ

ํŒŒ์ผ Example.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <LangVersion>14.0</LangVersion>
    <Nullable>enable</Nullable>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

</Project>

ํŒŒ์ผ Program.cs:

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

internal static unsafe class Program
{
    public static void Main()
    {
        delegate* unmanaged[Cdecl]<int, int, int> callback = &Difference;
        int result = InvokeCallback(callback, 14, 5);
        Console.WriteLine(result);
    }
    private static int InvokeCallback(delegate* unmanaged[Cdecl]<int, int, int> callback,
        int left, int right) => callback(left, right);
    [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })]
    private static int Difference(int left, int right) => left - right;
}

๊ฒฐ๊ณผ:

9

๊ณต์‹ ์ถœ์ฒ˜: Microsoft ํ•™์Šต.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ