欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java快速轉(zhuǎn)C#的簡(jiǎn)明教程

 更新時(shí)間:2025年07月26日 09:58:44   作者:zimoyin  
最近正在研究將一個(gè)純java工程如何轉(zhuǎn)換成C#工程,代碼量還比較大,這里記錄一番,這篇文章主要介紹了Java快速轉(zhuǎn)C#的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

以下是一個(gè)針對(duì) Java 開發(fā)者快速轉(zhuǎn)向 C# 的簡(jiǎn)明教程,重點(diǎn)對(duì)比 Java 與 C# 的異同,幫助你快速上手。

項(xiàng)目結(jié)構(gòu):

  • .sln :解決方案文件,管理多個(gè)項(xiàng)目之間的依賴關(guān)系。
  • .csproj :項(xiàng)目文件,定義目標(biāo)框架(如 net6.0)、依賴項(xiàng)(NuGet 包或本地 DLL)。
  • global.json: 控制 .NET SDK 行為
    • 指定 .NET SDK 版本 :確保項(xiàng)目使用特定版本的 SDK 構(gòu)建(避免本地環(huán)境版本不一致)。
    • 控制項(xiàng)目掃描范圍 :在多項(xiàng)目解決方案中,指定哪些目錄參與構(gòu)建。
    • 啟用/禁用 SDK 安裝提示 :控制是否自動(dòng)下載未安裝的 SDK 版本。
  • app.manifest: 應(yīng)用程序清單文件
    • 聲明應(yīng)用程序權(quán)限 (如以管理員身份運(yùn)行)。
    • 指定兼容性需求 (如支持的 Windows 版本)。
    • 啟用 Visual Studio 高 DPI 支持 。
    • 配置應(yīng)用程序隔離(Side-by-Side Assembly) 。
  • Program.cs :程序入口(包含 Main 方法)。

一、基礎(chǔ)語法對(duì)比

1.變量與數(shù)據(jù)類型

JavaC#
int a = 10;int a = 10;
String name = "Hello";string name = "Hello";
final int MAX = 100;const int MAX = 100;
var list = new ArrayList<>(); (Java 10+)var list = new List<string>();

C# 特色:

  • var 是隱式類型變量(編譯器推斷類型)。
  • dynamic 類型可動(dòng)態(tài)賦值(類似 Object)。

2.拓展方法

C# 的擴(kuò)展方法允許你為現(xiàn)有類型 (包括密封類、接口、甚至第三方庫的類型)“添加”方法,而無需修改其源代碼或繼承。這是 C# 特有的語法特性,Java 中無直接等價(jià)物(需通過工具類或繼承實(shí)現(xiàn))。

定義擴(kuò)展方法

  • 必須在靜態(tài)類 中定義。
  • 第一個(gè)參數(shù)使用 this 關(guān)鍵字,表示該方法擴(kuò)展的目標(biāo)類型
// 靜態(tài)類:擴(kuò)展方法容器
public static class StringExtensions {
    // 擴(kuò)展 string 類型的方法
    public static bool IsNullOrEmpty(this string str) {
        return string.IsNullOrEmpty(str);
    }
}

使用拓展方法

string name = null;

// 調(diào)用擴(kuò)展方法(如同實(shí)例方法)
if (name.IsNullOrEmpty()) {
    Console.WriteLine("Name is null or empty");
}

值得注意的是,拓展方法作為一個(gè)語法糖對(duì)應(yīng)的可以解決在Java中 xxUtils 的工具類。同時(shí)具有以下注意:

  • 無法訪問內(nèi)部方法/屬性
  • 若類型本身有同名方法,實(shí)例方法優(yōu)先于擴(kuò)展方法
  • 避免過度使用,防止命名沖突(需顯式導(dǎo)入命名空間)

3.空運(yùn)算符(Null Handling Operators)

C# 提供了強(qiáng)大的空值處理運(yùn)算符,簡(jiǎn)化空值檢查邏輯,避免 NullReferenceException

1. 空條件運(yùn)算符(?.)

用于安全訪問對(duì)象的成員,若對(duì)象為 null 則返回 null 而非拋出異常。

Person person = GetPerson(); // 可能為 null

// 安全訪問屬性和方法
int length = person?.Name?.Length ?? 0;
person?.SayHello();

對(duì)比 Java

  • Java 中需顯式判斷或使用 Optional

    int length = Optional.ofNullable(person)
                          .map(p -> p.getName())
                          .map(String::length)
                          .orElse(0);
    

2. 空合并運(yùn)算符(??)

提供默認(rèn)值,當(dāng)左側(cè)表達(dá)式為 null 時(shí)返回右側(cè)值。

string name = null;
string displayName = name ?? "Guest"; // 如果 name 為 null,則使用 "Guest"

對(duì)比 Java

  • Java 中使用三元運(yùn)算符或 Optional

    String displayName = name != null ? name : "Guest";
    // 或
    String displayName = Optional.ofNullable(name).orElse("Guest");
    

3. 空合并賦值運(yùn)算符(??=)

僅當(dāng)變量為 null 時(shí)才賦值(C# 8.0+)。

string message = GetMessage();
message ??= "Default Message"; // 如果 GetMessage() 返回 null,則賦值為默認(rèn)值

對(duì)比 Java

  • Java 中需顯式判斷:
    if (message == null) {
        message = "Default Message";
    }
    

4. 非空斷言運(yùn)算符(!)

告知編譯器某個(gè)表達(dá)式不為 null(C# 8.0+,用于可空引用類型上下文)。

string name = GetName()!; // 告訴編譯器 GetName() 返回值不為 null

注意事項(xiàng)

  • 空條件運(yùn)算符返回的類型可能是 null(需結(jié)合 ?? 使用)。
  • 空合并運(yùn)算符適用于 null 檢查,但不適用于值類型(如 int)。
  • 使用 ?.?? 組合可顯著減少防御性代碼(如嵌套 if 判斷)。

二、面向?qū)ο缶幊?/h2>

1.類與對(duì)象

public class Person {
    // 字段
    private string name;

    // 屬性(推薦封裝字段)
    public string Name {
        get { return name; }
        set { name = value; }
    }

    // 構(gòu)造函數(shù)
    public Person(string name) {
        this.name = name;
    }

    // 方法
    public void SayHello() {
        Console.WriteLine($"Hello, {name}");
    }
}

對(duì)比 Java:

  • C# 使用 property(屬性)替代 Java 的 getter/setter。
  • this 關(guān)鍵字用法相同。

2.繼承與接口

// 繼承
public class Student : Person {
    public Student(string name) : base(name) {}
}

// 接口
public interface IRunnable {
    void Run();
}

public class Car : IRunnable {
    public void Run() {
        Console.WriteLine("Car is running");
    }
}

對(duì)比 Java:

  • C# 使用 : 替代 Java 的 extends/implements
  • 接口方法默認(rèn) public,無需顯式聲明。

三、C# 特有特性

1.委托與事件(Delegates & Events)

// 委托(類似 Java 的函數(shù)式接口)
// 定義一個(gè)名為 Notify 的委托類型,它表示一種方法模板,要求方法返回 void 并接受一個(gè) string 參數(shù)
// 類比 Java :類似 Java 中的函數(shù)式接口(如 Consumer<String>),但 C# 的委托更直接,可以直接綁定方法。
public delegate void Notify(string message);

// 事件
public class EventPublisher {
	// 聲明一個(gè)事件 OnNotify,其類型是 Notify 委托。事件本質(zhì)上是委托的安全封裝,外部只能通過 +=/-= 訂閱/取消訂閱,不能直接調(diào)用(如 OnNotify.Invoke() 會(huì)報(bào)錯(cuò))。
    public event Notify OnNotify;

	// 調(diào)用 OnNotify?.Invoke(...) 觸發(fā)事件,?. 是空值保護(hù)操作符(避免空引用異常)。只有當(dāng)至少有一個(gè)訂閱者時(shí),才會(huì)執(zhí)行。
    public void TriggerEvent() {
        OnNotify?.Invoke("Event triggered!");
    }
}

// 使用
EventPublisher publisher = new EventPublisher();
publisher.OnNotify += (msg) => Console.WriteLine(msg);
publisher.TriggerEvent();
  • 訂閱事件
    使用 +=運(yùn)算符將一個(gè) lambda 表達(dá)式 (msg) => Console.WriteLine(msg)綁定到 OnNotify 事件。當(dāng)事件觸發(fā)時(shí),會(huì)執(zhí)行此方法。

  • 觸發(fā)事件
    調(diào)用 TriggerEvent() 后,所有訂閱者都會(huì)收到 “Event triggered!” 消息。

2.LINQ(Language Integrated Query)

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var even = numbers.Where(n => n % 2 == 0).ToList();

對(duì)比 Java:

  • 類似 Java Stream,但語法更簡(jiǎn)潔。

3.異步編程(Async/Await)

public async Task DownloadDataAsync() {
    var client = new HttpClient();
    var data = await client.GetStringAsync("https://example.com");
    Console.WriteLine(data);
}

對(duì)比 Java:

  • 類似 CompletableFuture,但語法更直觀。
Parallel.Invoke(() => {
   // 并行執(zhí)行CPU密集任務(wù)
});
  • 多個(gè) CPU 密集型任務(wù)并行執(zhí)行。
  • 任務(wù)之間沒有依賴。
  • 不需要返回結(jié)果。

四、常用工具與框架

JavaC#
Maven/GradleNuGet(包管理)
Spring.NET Core(框架)
JUnitxUnit/NUnit(測(cè)試框架)
IntelliJ IDEAVisual Studio / IntelliJ Rider(IDE)

五、項(xiàng)目結(jié)構(gòu)與命名空間

// 文件:Program.cs
using System;
namespace MyApplication;

class Program {
    static void Main(string[] args) {
        Console.WriteLine("Hello World!");
    }
}

對(duì)比 Java:

  • C# 使用 namespace 組織代碼,Java 使用 package。
  • 程序入口是 Main 方法(Java 是 main)。

六、Java 到 C# 的常見轉(zhuǎn)換技巧

JavaC#
System.out.println()Console.WriteLine()
ArrayList<T>List<T>
HashMap<K,V>Dictionary<K,V>
interfaceinterface
enumenum
try-catch-finallytry-catch-finally

C# 中,反射(Reflection) 是一種強(qiáng)大的機(jī)制,允許在運(yùn)行時(shí)動(dòng)態(tài)地獲取類型信息、創(chuàng)建對(duì)象實(shí)例、調(diào)用方法、訪問字段和屬性等。對(duì)于從 Java 轉(zhuǎn)向 C# 的開發(fā)者來說,反射的概念是相似的,但 C# 的反射 API 更加簡(jiǎn)潔、直觀,并且與語言特性(如 dynamic、nameof、LINQ)結(jié)合更緊密。

七、反射

反射是指在 運(yùn)行時(shí)(runtime) 動(dòng)態(tài)地:

  • 獲取類型信息(如類名、方法、屬性等)
  • 創(chuàng)建對(duì)象實(shí)例
  • 調(diào)用方法、訪問字段或?qū)傩?/li>
  • 檢查程序集(Assembly)的結(jié)構(gòu)

Java 與 C# 反射的對(duì)比

功能JavaC#
獲取類型對(duì)象MyClass.classobj.getClass()typeof(MyClass)obj.GetType()
獲取方法clazz.getMethod("name", params...)type.GetMethod("Name")
調(diào)用方法method.invoke(obj, args)method.Invoke(obj, args)
獲取屬性clazz.getDeclaredField("name")type.GetProperty("Name")
獲取程序集無直接等價(jià)物Assembly.GetExecutingAssembly()
動(dòng)態(tài)創(chuàng)建實(shí)例clazz.newInstance()Activator.CreateInstance(type)
動(dòng)態(tài)訪問成員通過 Field/Method 對(duì)象通過 PropertyInfo/MethodInfo

1. 獲取Type對(duì)象

// 通過類型名獲取
Type type = typeof(string);

// 通過對(duì)象獲取
object obj = new Person();
Type type = obj.GetType();

2. 獲取類成員信息(屬性、方法、字段)

Type type = typeof(Person);

// 獲取所有屬性
PropertyInfo[] properties = type.GetProperties();

// 獲取特定方法
MethodInfo method = type.GetMethod("SayHello");

// 獲取所有字段
FieldInfo[] fields = type.GetFields();

3. 動(dòng)態(tài)創(chuàng)建實(shí)例

object person = Activator.CreateInstance(typeof(Person));

4. 調(diào)用方法

MethodInfo method = type.GetMethod("SayHello");
method.Invoke(person, null);

5. 訪問屬性

PropertyInfo prop = type.GetProperty("Name");
prop.SetValue(person, "Alice");
string name = (string)prop.GetValue(person);

6. 訪問字段(不推薦,除非必要)

FieldInfo field = type.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(person, 30);
int age = (int)field.GetValue(person);

7. 獲取程序集信息

Assembly assembly = Assembly.GetExecutingAssembly();
foreach (Type type in assembly.GetTypes()) {
    Console.WriteLine(type.Name);
}

8. 動(dòng)態(tài)加載 DLL 并調(diào)用方法

Assembly assembly = Assembly.LoadFile("path/to/MyLibrary.dll");
Type type = assembly.GetType("MyNamespace.MyClass");
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("DoSomething");
method.Invoke(instance, null);

9. 使用dynamic替代部分反射操作

dynamic person = new ExpandoObject();
person.Name = "Bob";
person.SayHello = new Action(() => Console.WriteLine("Hello"));
person.SayHello(); // 無需反射即可調(diào)用

10. 使用Expression構(gòu)建高性能的反射調(diào)用

Func<object> factory = Expression.Lambda<Func<object>>(
    Expression.New(typeof(Person))
).Compile();
object person = factory();

11. 使用IL Emit或Source Generator優(yōu)化性能

對(duì)于高性能場(chǎng)景(如 ORM、序列化框架),可以使用:

  • System.Reflection.Emit:動(dòng)態(tài)生成 IL 代碼
  • Source Generator(C# 9+):編譯時(shí)生成代碼,避免運(yùn)行時(shí)反射

性能問題

  • 反射調(diào)用比直接調(diào)用慢(約慢 10~100 倍)
  • 頻繁使用 GetMethod、GetProperty 會(huì)增加開銷

解決方案

  • 緩存反射結(jié)果(如 MethodInfo、PropertyInfo
  • 使用 Expression 構(gòu)建委托
  • 使用 dynamic(在合適場(chǎng)景下)
  • 使用 System.Reflection.DispatchProxy 實(shí)現(xiàn)代理
  • 使用 System.Text.Json、Newtonsoft.Json 等庫已優(yōu)化的反射機(jī)制

安全性

  • 可以訪問私有成員(需設(shè)置 BindingFlags.NonPublic
  • 在部分受限環(huán)境中(如 UWP、AOT 編譯)可能受限

Java 到 C# 反射的轉(zhuǎn)換技巧

JavaC#
Class.forName("MyClass")Type.GetType("MyNamespace.MyClass")
clazz.newInstance()Activator.CreateInstance(type)
method.invoke(obj, args)method.Invoke(obj, args)
clazz.getDeclaredMethods()type.GetMethods()
clazz.getDeclaredFields()type.GetFields()
clazz.getDeclaredField("name")type.GetField("Name")
clazz.getDeclaredMethod("name", params...)type.GetMethod("Name", parameterTypes)
clazz.getInterfaces()type.GetInterfaces()

八、引入包(NuGet 包管理)

在 C# 中,NuGet 是官方推薦的包管理系統(tǒng),類似于 Java 中的 Maven/Gradle。它用于管理項(xiàng)目依賴項(xiàng)(如第三方庫、框架等)。

NuGet 包典型命名規(guī)則:[組織名].[功能模塊].[平臺(tái)/框架]

1.NuGet 的作用

  • 管理項(xiàng)目依賴(如 Newtonsoft.Json、EntityFramework 等)
  • 自動(dòng)下載、安裝、更新依賴包
  • 支持跨平臺(tái)(Windows、Linux、macOS)

2.常用方式

方法 1:通過 Visual Studio 引入

  1. 右鍵項(xiàng)目 → Manage NuGet Packages
  2. Browse 標(biāo)簽頁搜索包名(如 Newtonsoft.Json
  3. 點(diǎn)擊 Install 安裝包
  4. 安裝完成后,會(huì)自動(dòng)添加到項(xiàng)目中

方法 2:通過 CLI 命令行

# 安裝包
dotnet add package Newtonsoft.Json

# 更新包
dotnet add package Newtonsoft.Json --version 13.0.1

# 卸載包
dotnet remove package Newtonsoft.Json

方法 3:手動(dòng)編輯.csproj文件

在項(xiàng)目文件中添加 <PackageReference>

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
  </ItemGroup>
</Project>

3.NuGet 源配置

默認(rèn)源是 nuget.org,但也可以配置私有源(如公司內(nèi)部源):

# 添加私有源
dotnet nuget add source https://mycompany.com/nuget -n MyCompany

4.對(duì)比 Java

功能Java (Maven/Gradle)C# (NuGet)
包管理pom.xml / build.gradle.csproj
安裝包mvn install / gradle builddotnet add package
私有倉庫settings.xml / repositories { maven { url "..." } }dotnet nuget add source

九、引用本地的 DLL

有時(shí)你需要引用本地的 DLL 文件(如團(tuán)隊(duì)內(nèi)部開發(fā)的庫、第三方未提供 NuGet 包的庫),可以通過以下方式實(shí)現(xiàn)。

1.添加本地 DLL 引用

方法 1:通過 Visual Studio 添加

  1. 右鍵項(xiàng)目 → Add → Reference…
  2. 在彈出窗口中選擇 Browse
  3. 瀏覽并選擇本地 DLL 文件(如 MyLibrary.dll
  4. 點(diǎn)擊 AddOK

方法 2:手動(dòng)編輯.csproj文件

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="MyLibrary">
      <HintPath>..\Libraries\MyLibrary.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

2.確保 DLL 被正確復(fù)制到輸出目錄

.csproj 中添加以下配置,確保 DLL 被復(fù)制到 bin 目錄:

<ContentWithTargetPath Include="..\Libraries\MyLibrary.dll">
  <TargetPath>MyLibrary.dll</TargetPath>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ContentWithTargetPath>

3.加載本地 DLL 的運(yùn)行時(shí)行為

  • Windows:直接復(fù)制到 bin\Debug\net6.0 目錄即可
  • Linux/macOS:確保 DLL 與主程序在同一目錄,或設(shè)置 LD_LIBRARY_PATH / DYLD_LIBRARY_PATH

4.注意事項(xiàng)

  • 強(qiáng)名稱簽名(Strong Name):如果 DLL 是強(qiáng)名稱簽名的,引用時(shí)需確保簽名一致
  • 平臺(tái)相關(guān)性:某些 DLL 僅支持特定平臺(tái)(如 Windows 專用的 DLL)
  • 版本沖突:多個(gè) DLL 依賴相同庫的不同版本時(shí),可能出現(xiàn)沖突(需手動(dòng)綁定重定向)

常見問題與解決方案

1.無法找到 DLL

  • 原因:DLL 未正確復(fù)制到輸出目錄
  • 解決:檢查 .csproj 中是否設(shè)置了 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

2.加載 DLL 失敗

  • 原因:DLL 依賴的其他庫缺失
  • 解決:使用 Fusion Log Viewerfuslogvw.exe)查看綁定失敗日志

3.版本沖突

  • 原因:多個(gè) DLL 依賴相同庫的不同版本

十、DllImport(平臺(tái)調(diào)用,P/Invoke)

在 C# 中,[DllImport("xxx.dll")]平臺(tái)調(diào)用(Platform Invocation Services,P/Invoke) 的核心特性,用于直接調(diào)用 非托管代碼(如 Windows API、C/C++ 編寫的 DLL)。這是 Java 中沒有的特性(Java 需要通過 JNI 調(diào)用本地代碼)。

1.基本概念

[DllImport]System.Runtime.InteropServices 命名空間下的特性(Attribute),用于聲明某個(gè)方法的實(shí)現(xiàn)來自外部 DLL。它允許你在 C# 中直接調(diào)用 Windows API 或其他非托管函數(shù)。

2.使用步驟

步驟 1:引入命名空間

using System.Runtime.InteropServices;

步驟 2:聲明外部方法

使用 [DllImport("dll名稱")] 特性修飾方法,指定 DLL 名稱和調(diào)用約定(Calling Convention)。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

步驟 3:調(diào)用方法

MessageBox(IntPtr.Zero, "Hello from C#", "Greeting", 0);

3.參數(shù)說明

參數(shù)說明
dllNameDLL 文件名(如 "user32.dll"
CharSet字符集(CharSet.Ansi、CharSet.Unicode、CharSet.Auto
CallingConvention調(diào)用約定(默認(rèn)為 CallingConvention.Winapi,也可指定 ThisCall、StdCall 等)
EntryPoint可選,指定 DLL 中函數(shù)的入口點(diǎn)(當(dāng)方法名與 DLL 函數(shù)名不同時(shí)使用)

4.常見示例

示例 1:調(diào)用user32.dll的MessageBox

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);

// 調(diào)用
MessageBox(IntPtr.Zero, "Hello from C#", "Greeting", 0);

示例 2:調(diào)用kernel32.dll的GetTickCount

[DllImport("kernel32.dll")]
public static extern uint GetTickCount();

// 調(diào)用
uint tickCount = GetTickCount();
Console.WriteLine($"System uptime: {tickCount} ms");

示例 3:調(diào)用gdi32.dll的CreateDC

[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);

// 調(diào)用
IntPtr hdc = CreateDC("DISPLAY", null, null, IntPtr.Zero);

5.結(jié)構(gòu)體與指針傳參

當(dāng)調(diào)用的函數(shù)需要結(jié)構(gòu)體或指針參數(shù)時(shí),需使用 ref、outIntPtr,并可能需要使用 StructLayoutMarshalAs 來控制內(nèi)存布局。

示例:調(diào)用user32.dll的GetWindowRect

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

// 使用
RECT rect;
bool success = GetWindowRect(hWnd, out rect);
if (success)
{
    Console.WriteLine($"Window Rect: {rect.Left}, {rect.Top}, {rect.Right}, {rect.Bottom}");
}

6.注意事項(xiàng)

安全性

  • 調(diào)用非托管代碼可能帶來 安全風(fēng)險(xiǎn)(如緩沖區(qū)溢出、非法訪問內(nèi)存)。
  • 需要 Full Trust 權(quán)限 才能執(zhí)行 P/Invoke 操作。

平臺(tái)依賴性

  • DllImport 僅適用于 Windows 平臺(tái)(除非使用跨平臺(tái)兼容的庫)。
  • 某些 DLL(如 user32.dll、kernel32.dll)是 Windows 系統(tǒng)庫,其他平臺(tái)無法直接使用。

性能

  • P/Invoke 調(diào)用比純托管代碼慢(涉及 上下文切換參數(shù)封送)。
  • 頻繁調(diào)用時(shí)應(yīng)考慮緩存結(jié)果或使用 unsafe 代碼優(yōu)化。

參數(shù)封送(Marshaling)

  • 需要特別注意 數(shù)據(jù)類型映射(如 int 對(duì)應(yīng) Int32char* 對(duì)應(yīng) string)。
  • 使用 MarshalAs 明確指定封送方式(如 UnmanagedType.LPStr、UnmanagedType.BStr)。

7. 示例:封裝一個(gè) Windows API 工具類

using System;
using System.Runtime.InteropServices;

public static class Win32Api
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);

    [DllImport("kernel32.dll")]
    public static extern uint GetTickCount();

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
}

// 使用
class Program
{
    static void Main()
    {
        // 調(diào)用 MessageBox
        Win32Api.MessageBox(IntPtr.Zero, "Hello from C#", "Greeting", 0);

        // 獲取系統(tǒng)運(yùn)行時(shí)間
        uint tickCount = Win32Api.GetTickCount();
        Console.WriteLine($"System uptime: {tickCount} ms");

        // 獲取窗口位置
        Win32Api.RECT rect;
        bool success = Win32Api.GetWindowRect(new IntPtr(0x123456), out rect);
        if (success)
        {
            Console.WriteLine($"Window Rect: {rect.Left}, {rect.Top}, {rect.Right}, {rect.Bottom}");
        }
    }
}

通過掌握 DllImport 和 P/Invoke,你可以在 C# 中直接調(diào)用 Windows API 或其他非托管函數(shù),實(shí)現(xiàn)更底層的系統(tǒng)級(jí)操作。結(jié)合良好的封裝和錯(cuò)誤處理,可以顯著提升程序的功能性和靈活性。

總結(jié)

到此這篇關(guān)于Java快速轉(zhuǎn)C#的文章就介紹到這了,更多相關(guān)Java快速轉(zhuǎn)C#內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談synchronized加鎖this和class的區(qū)別

    淺談synchronized加鎖this和class的區(qū)別

    synchronized 是 Java 語言中處理并發(fā)問題的一種常用手段,本文主要介紹了synchronized加鎖this和class的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-11-11
  • IDEA中項(xiàng)目集成git提交代碼的詳細(xì)步驟

    IDEA中項(xiàng)目集成git提交代碼的詳細(xì)步驟

    這篇文章主要介紹了IDEA中項(xiàng)目集成git提交代碼的詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • spring中Mapstruct屬性映射的實(shí)現(xiàn)

    spring中Mapstruct屬性映射的實(shí)現(xiàn)

    本文主要介紹了spring中Mapstruct屬性映射的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境

    基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境

    這篇文章主要介紹了基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java實(shí)現(xiàn)FutureTask的示例詳解

    Java實(shí)現(xiàn)FutureTask的示例詳解

    在并發(fā)編程當(dāng)中我們最常見的需求就是啟動(dòng)一個(gè)線程執(zhí)行一個(gè)函數(shù)去完成我們的需求,而在這種需求當(dāng)中,我們需要函數(shù)有返回值。Java給我們提供了這種機(jī)制,去實(shí)現(xiàn)這一個(gè)效果:FutureTask。本文為大家準(zhǔn)備了Java實(shí)現(xiàn)FutureTask的示例代碼,需要的可以參考一下
    2022-08-08
  • Java開發(fā)人員需知的十大戒律

    Java開發(fā)人員需知的十大戒律

    這篇文章主要介紹了Java開發(fā)人員需知的十大戒律,較為詳細(xì)的總結(jié)分析了Java開發(fā)中常見的注意事項(xiàng)與編程技巧,需要的朋友可以參考下
    2015-10-10
  • MyBatis-Plus 動(dòng)態(tài)表名SQL解析器的實(shí)現(xiàn)

    MyBatis-Plus 動(dòng)態(tài)表名SQL解析器的實(shí)現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 動(dòng)態(tài)表名SQL解析器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring基于注解配置AOP詳解

    Spring基于注解配置AOP詳解

    這篇文章主要介紹了Spring基于注解配置AOP詳解,Spring 的 AOP 功能是基于 AspectJ 實(shí)現(xiàn)的,支持使用注解聲明式定義 AOP 切面,Spring 基于注解配置 AOP 需要啟用 AspectJ 自動(dòng)代理功能,需要的朋友可以參考下
    2023-09-09
  • mybatis foreach 循環(huán) list(map)實(shí)例

    mybatis foreach 循環(huán) list(map)實(shí)例

    這篇文章主要介紹了mybatis foreach 循環(huán) list(map)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java提效神器Stream的一些冷門技巧匯總

    Java提效神器Stream的一些冷門技巧匯總

    這篇文章主要給大家介紹了關(guān)于Java提效神器Stream的一些冷門技巧,Stream是java對(duì)集合操作的優(yōu)化,相較于迭代器,使用Stream的速度非???并且它支持并行方式處理集合中的數(shù)據(jù),默認(rèn)情況能充分利用cpu的資源,需要的朋友可以參考下
    2021-07-07

最新評(píng)論