从.NET Core应用程序P /调用Fusion.dll

时间:2019-07-16 00:13:23

标签: c# .net-core pinvoke gac

我正在将.NET应用程序迁移到.NET Core,该应用程序需要执行的任务之一是枚举.NET全局程序集缓存中的程序集(是,我知道 .NET Core应用程序本身不使用GAC,但是我的应用程序的目的之一是创建完整.NET Framework GAC中内容的清单。

我尝试在Fusion.dll中P / Invoke的任何方法都会给我同样的错误:

  

未处理的异常: System.DllNotFoundException :无法加载DLL   'Fusion.dll'或其依赖项之一:指定的模块可以   找不到。 (来自HRESULT的异常:0x8007007E)

代码示例:

class Program
{
    static void Main(string[] args)
    {
        GacUtility.CreateAssemblyCache(out var x, 0);
    }
}

public class GacUtility
{
    [DllImport("Fusion.dll")]
    public static extern int CreateAssemblyCache(out object asmCache, int reserved);
}

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

</Project>

NB:我知道正确的签名CreateAssemblyCache会期望IAssemblyNameI have that right in my code,这给了我同样的错误。我在上面使用object来简化可重现的示例。

1 个答案:

答案 0 :(得分:0)

将平台更改为x64,并指定dllImport的完整路径,以及对IntPtr而不是对象的签名对我来说都是有效的,

class Program
{
    static void Main(string[] args)
    {
        GacUtility.CreateAssemblyCache(out IntPtr x, 0);
    }
}

public class GacUtility
{
    [DllImport(@"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\fusion.dll")]
    public static extern int CreateAssemblyCache(out IntPtr asmCache, int reserved);
}

但是,对于x86来说,奇怪的是没有