Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# C从.NETDLL导入_C#_.net_Reflection_Dllimport - Fatal编程技术网

C# C从.NETDLL导入

C# C从.NETDLL导入,c#,.net,reflection,dllimport,C#,.net,Reflection,Dllimport,如何从.NET DLL导入方法以从C代码调用?我已经尝试了[DllImport…]方法和将反射用于汇编。我对.NET非常缺乏经验,如果这是一个非常基本的问题,我深表歉意。我的目标是调用LZ4Decompressor32.Decompressbyte[] 反射器显示LZ4Decompressor32是从基型ILZ4Decompressor派生而来的类型。所有这些都驻留在Exec下,我猜它是父命名空间 截图: 我想我只是弄乱了名称空间或类型路径,但我已经尝试了我能想到的所有组合 仅供参考,这是一个古

如何从.NET DLL导入方法以从C代码调用?我已经尝试了[DllImport…]方法和将反射用于汇编。我对.NET非常缺乏经验,如果这是一个非常基本的问题,我深表歉意。我的目标是调用LZ4Decompressor32.Decompressbyte[]

反射器显示LZ4Decompressor32是从基型ILZ4Decompressor派生而来的类型。所有这些都驻留在Exec下,我猜它是父命名空间

截图:

我想我只是弄乱了名称空间或类型路径,但我已经尝试了我能想到的所有组合

仅供参考,这是一个古老的CTF挑战,我正在学习。完整挑战从其资源部分提取下一个阶段,然后对资源数据调用LZ4Decompressor32.Decompress方法

ResourceManager manager = new ResourceManager(Name, Assembly.GetExecutingAssembly());
byte[] compressed = (byte[]) manager.GetObject("data");
return new LZ4Decompressor32().Decompress(compressed);
编辑:有关详细信息,请参阅在程序集上调试和中断时。LoadFrom。。。我得到以下错误:

无法加载文件或程序集“file:///[dll path]”或其依赖项之一。模块应包含程序集清单

我通过Dependency Walker运行了DLL,唯一的投诉是MSJAVA.DLL,Dependency Walker对此进行了解释。

遵循以下步骤

在Visual Studio中打开主程序、web项目或exe项目的项目

找到解决方案资源管理器窗格

右键单击“引用”节点并选择“添加引用”

单击浏览

选择要导入的DLL,然后单击“确定”

祝贺您,您现在已经导入了DLL中的所有非内部、非私有类和方法


只需实例化并使用。

我通过从LZ4Sharp项目导入源代码解决了这个问题。我的希望是学习一些关于反射和名称空间/类路径的知识,但我想我可以自己尝试一下。谢谢大家的建议,;感谢@Frank Boyne对regsvr32和regasm的解释。

只需向程序集添加一个项目引用,适当的使用namespaceDllImport是针对非托管代码的。根据您的帖子和其他评论,您使用的DLL类型似乎有点不清楚。有三种类型:Win32、COM和.NET。如果你不知道你在和哪种类型的人一起工作,那就有问题了!请在您的计算机上定位ildasm.exe,运行它,然后尝试打开有问题的DLL。如果它打开,它是一个.NET DLL。如果没有,请尝试运行RegSvr32.exe。如果这是一个COM DLL。否则它可能是一个Win32 DLL。这是我忘记提到的另一种方法,但通过项目>添加引用。。。我怀疑是同一条路。错误是无法添加对的引用。请确保该文件可访问,并且是有效的程序集或COM组件。谷歌搜索这个错误,我发现DLL需要注册。然而,当我试图用regsrv32注册它时,我收到的不是一个可执行文件,并且没有为该文件类型注册任何注册助手。从文件:PE32可执行文件MS Windows DLL控制台英特尔80386 32位Mono/.Net assemblyMore谷歌搜索得到了使用RegAsm的建议,该建议导致以下错误:RegAsm:error RA0000:未能加载,因为它不是有效的.Net程序集。我已经尝试了所有的解决方法,如我发现的以管理员身份运行、检查文件权限、尝试其他/tlb路径等,但仍然没有成功。看来注册DLL仍然是我的拦截器。@MikeJones您尝试注册DLL时可能走错了方向。Regsvr32和regasm用于注册COM对象,但LZ4Sharp似乎不是COM对象。Regsvr32期望加载一个本机代码DLL库,这就是为什么您会收到“非可执行文件”错误-对于期望本机代码的程序,托管程序集看起来无效。期望加载包含COM对象(包括COM特定元数据)的托管程序集。您获取的.NET程序集无效,因为没有COM metatdata。