要在C# WebAssembly中與C++進行互操作,你需要使用WebAssembly的互操作性特性。這允許你在C#代碼中調用C++函數,并在C++代碼中調用C#函數。以下是實現這一目標的步驟:
創建一個C++ DLL項目:
首先,你需要創建一個C++ DLL項目,其中包含你想要在C#中調用的函數。確保將DLL導出為C風格的函數,以便C#可以調用它們。例如,創建一個名為MyCppLibrary.cpp
的文件,其中包含以下內容:
#include <iostream>
#include <string>
extern "C" {
#include "MyCppLibrary.h"
}
std::string greet(const char* name) {
return "Hello, " + std::string(name);
}
void print_hello() {
std::cout << "Hello from C++!" << std::endl;
}
__declspec(dllexport) void CallGreet(const char* name) {
std::cout << greet(name) << std::endl;
}
然后,創建一個名為MyCppLibrary.h
的頭文件,其中包含以下內容:
#ifndef MY_CPP_LIBRARY_H
#define MY_CPP_LIBRARY_H
std::string greet(const char* name);
void print_hello();
__declspec(dllexport) void CallGreet(const char* name);
#endif // MY_CPP_LIBRARY_H
編譯C++ DLL:
使用Visual Studio或其他C++編譯器編譯項目,生成一個名為MyCppLibrary.dll
的DLL文件。確保將DLL放在與你的C# WebAssembly項目相同的目錄中。
創建一個C# WebAssembly項目: 使用Visual Studio或Visual Studio Code創建一個新的C# WebAssembly項目。在項目中添加以下代碼,以加載和調用C++ DLL中的函數:
using System;
using System.Runtime.InteropServices;
using WebAssembly;
class Program
{
static void Main()
{
// Load the C++ DLL
var myCppLibrary = WebAssembly.InstantiateStreaming(
System.IO.File.OpenRead("MyCppLibrary.dll"),
new WebAssembly.ImportObject[]
{
new WebAssembly.ImportObject { Name = "greet", Type = typeof(Greet) },
new WebAssembly.ImportObject { Name = "print_hello", Type = typeof(PrintHello) },
new WebAssembly.ImportObject { Name = "CallGreet", Type = typeof(CallGreet) }
}
).Exports;
// Call C++ functions from C#
var name = "World";
myCppLibrary.greet(name);
((Action)myCppLibrary["print_hello"])();
((Action)myCppLibrary["CallGreet"])(name);
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate string Greet(string name);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void PrintHello();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallGreet(string name);
}
構建和運行C# WebAssembly項目: 使用Visual Studio或Visual Studio Code構建項目,并將生成的WebAssembly文件部署到Web服務器上。然后,在瀏覽器中訪問應用程序,你應該能夠看到C#代碼成功調用了C++ DLL中的函數。
注意:由于瀏覽器的安全限制,你可能需要在本地或遠程服務器上運行此示例。如果你在本地運行,請確保使用支持WebAssembly的Web服務器,如IIS、Nginx或其他類似的Web服務器。