.NET 8 PublishAot生成Native DLL无法引用问题求助
解决思路
首先明确:你用PublishAot生成的是原生(Native)机器码DLL,它既不是.NET托管程序集,也不是注册过的COM组件,所以直接在项目里“引用DLL”或者用TlbImp处理都会报错,这是正常现象。下面是具体解决方向:
1. 正确调用原生DLL的方法
如果要在.NET程序里调用这个DLL的导出方法,需通过P/Invoke声明调用:
- 在调用方的.NET项目中,用
[DllImport]特性声明DLL的导出方法:
using System.Runtime.InteropServices; class Program { // 匹配DLL里的导出入口点Get_Text,注意调用约定要和导出一致 [DllImport("TestNativeLib.dll", EntryPoint = "Get_Text", CallingConvention = CallingConvention.Cdecl)] public static extern void GetText(); static void Main() { GetText(); } }
- 将生成的
TestNativeLib.dll放到调用程序的输出目录,或在DllImport中指定完整路径。
2. 修正项目配置的版本与输出类型问题
你的csproj中TargetFramework写的是net7.0,但你提到使用的是.NET 8,建议统一版本避免冲突:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <PublishAot>true</PublishAot> <!-- 明确生成动态链接库(DLL),若需静态库则改为Static --> <NativeLib>Shared</NativeLib> </PropertyGroup> </Project>
3. 若需作为COM组件使用(可选)
如果目标是让DLL能被当作COM组件引用,需额外配置COM导出:
- 在csproj中添加COM托管配置:
<PropertyGroup> <EnableComHosting>true</EnableComHosting> </PropertyGroup>
- 修改类代码,符合COM组件的规范要求:
using System.Runtime.InteropServices; namespace TestNativeLib { [ComVisible(true)] [Guid("生成唯一GUID,例如:12345678-1234-1234-1234-123456789ABC")] public interface ITestNativeLib { void GetText(); } [ComVisible(true)] [Guid("另一组唯一GUID")] public class Class1 : ITestNativeLib { public void GetText() { Console.WriteLine("Hey du"); } } }
- 发布完成后,以管理员权限执行
regsvr32.exe TestNativeLib.dll注册COM组件,之后即可用TlbImp生成互操作程序集,或直接在项目中引用COM组件。
内容的提问来源于stack exchange,提问作者reiniX86
相关产品推荐
相关产品推荐

