You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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导出:

  1. 在csproj中添加COM托管配置:
<PropertyGroup>
  <EnableComHosting>true</EnableComHosting>
</PropertyGroup>
  1. 修改类代码,符合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");
        }
    }
}
  1. 发布完成后,以管理员权限执行regsvr32.exe TestNativeLib.dll注册COM组件,之后即可用TlbImp生成互操作程序集,或直接在项目中引用COM组件。

内容的提问来源于stack exchange,提问作者reiniX86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:57:17