你好,@William Liu。欢迎来到 Microsoft 问答。
这种使用方式似乎并不主流。你可以尝试下面的方式来使用。
创建Class Library
创建一个名为ClassLibrary1
的Class Library
,在其下面创建一个名为StringGenerator
的类,添加下面的代码。
public class StringGenerator
{
[UnmanagedCallersOnly(EntryPoint = "GenerateString")]
public static IntPtr GenerateString(int length)
{
string result = new string('a', length);
return Marshal.StringToHGlobalAnsi(result);
}
}
点击ClassLibrary1
,在<PropertyGroup>
中添加<PublishAot>true</PublishAot>
。打开Terminal(View->Terminal),通过cd ClassLibrary1
定位到ClassLibrary1
项目中,运行下面的命令生成dll:
dotnet publish -r win-x64 -c Release
更详细的生成dll的方法你可以参考文档。
创建WPF Application
在MainWindow.xaml中按如下调整代码
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="7*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox x:Name="MyTextBox" Grid.Row="0" Width="400" Height="300" VerticalScrollBarVisibility="Visible" TextWrapping="Wrap" ></TextBox>
<Button Content="Click Me!" Width="200" Height="50" Click="Button_Click" Grid.Row="1"></Button>
</Grid>
在MainWindow.xaml.cs中按如下调整代码
public partial class MainWindow : Window
{
[DllImport("ClassLibrary1.dll", EntryPoint = "GenerateString", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GenerateString(int length);
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
int length = 10000;
IntPtr resultPtr = GenerateString(length);
string result = Marshal.PtrToStringAnsi(resultPtr);
MyTextBox.Text = "string length: " + result.Length + "\n" + "string: " + result;
// 记得释放非托管内存
Marshal.FreeHGlobal(resultPtr);
}
catch (Exception exception)
{
MessageBox.Show(exception.Message.ToString());
}
}
}
WPF项目引用dll
对WPF项目进行右键->Rebuild
。
将...ClassLibrary1\bin\Release\net8.0\win-x64\publish
处的ClassLibrary1.dll
复制到...WpfApp1\bin\Debug\net8.0-windows
。
配置启动方式为不构建直接运行。
以调试方式运行WPF项目
运行结果
如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。
注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。