Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从.NET核心应用程序调用P/Invoke Fusion.dll_C#_.net Core_Pinvoke_Gac - Fatal编程技术网

C# 从.NET核心应用程序调用P/Invoke Fusion.dll

C# 从.NET核心应用程序调用P/Invoke Fusion.dll,c#,.net-core,pinvoke,gac,C#,.net Core,Pinvoke,Gac,我正在将.NET应用程序迁移到.NET Core,应用程序需要执行的任务之一是枚举.NET全局程序集缓存中的程序集(是的,我知道my。NET Core应用程序本身不使用GAC,但我的应用程序的目的之一是创建完整.NET Framework GAC中的内容的清单) 我在Fusion.dll中尝试p/调用的任何方法都会产生相同的错误: 未处理的异常:系统。DllNotFoundException:无法加载DLL “Fusion.dll”或其依赖项之一:指定的模块可能 找不到。(来自HRESULT的异

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

我在
Fusion.dll
中尝试p/调用的任何方法都会产生相同的错误:

未处理的异常:系统。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);
}


Exe
netcoreapp2.2


注意:我知道
CreateAssemblyCache
的正确签名需要
iasemblyname
和,这给了我同样的错误。我正在使用上面的
object
来简化一个可复制的示例。

将平台更改为x64,并指定dllImport的完整路径,以及IntPtr而不是object的符号对我有效

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,它却奇怪地没有

当使用p/Invoke时,请确保您正在调用的函数已正确导出,项目和dll具有相同的体系结构,或者dll依赖项可用(您可以使用依赖项遍历器进行此操作).我可能错了,但GAC的概念在.NET Core中不可能与在.NET Framework中的概念相同。如果要在.NET GAC中清点DLL,最好是枚举适当文件夹的内容。毕竟GAC只是一些特定文件夹中DLL的集合。@SohaibJundi我肯定该函数已正确导出,project和dll具有相同的体系结构,因为当我从.NET Framework应用程序(32位和64位)调用它时,它可以正常工作。@Darkonekt这对我来说没有意义,因为我只是对外部dll进行P/调用。我在.NETCore上做这件事并不重要。理论上,P/Invoke可以调用任何类型的Win32 DLL,不是吗?这很重要,因为GAC的搜索方式不同。如果要加载dll并调用它。您需要提供完整路径,并确保DLL的体系结构与消费应用程序相同。这当然很有趣。谢谢分享。可能是.NET内核中的一个bug?将完整路径或目标设置为
x64
对我来说并不是一个真正的选项,因此我正在寻找一种解决方法
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);
}