C# 从.NET核心应用程序调用P/Invoke Fusion.dll
我正在将.NET应用程序迁移到.NET Core,应用程序需要执行的任务之一是枚举.NET全局程序集缓存中的程序集(是的,我知道my。NET Core应用程序本身不使用GAC,但我的应用程序的目的之一是创建完整.NET Framework GAC中的内容的清单) 我在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的异
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);
}