Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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是否支持Win32代码互操作?_C#_.net_Winapi_Interop_Portable Executable - Fatal编程技术网

C# .NET是否支持Win32代码互操作?

C# .NET是否支持Win32代码互操作?,c#,.net,winapi,interop,portable-executable,C#,.net,Winapi,Interop,Portable Executable,我需要与.NET的互操作Win32代码(非托管Win32 DLL和EXE)。我需要在运行时调用Win32非托管代码(DLL导出函数),知道Win32签名中的数据类型,并在运行时根据该类型传递数据 这对于COM是可能的,您可以使用tlbimp.exe将COM非托管代码转换为托管程序集,并使用反射API处理这些托管类型(使用tlbimp将非托管类型转换为托管类型) 如何在.NET framework中获得与Win32相同的功能 我知道MS提供了一个导出表读取API,但我找不到Win32非托管代码互操

我需要与.NET的互操作Win32代码(非托管Win32 DLL和EXE)。我需要在运行时调用Win32非托管代码(DLL导出函数),知道Win32签名中的数据类型,并在运行时根据该类型传递数据

这对于COM是可能的,您可以使用tlbimp.exe将COM非托管代码转换为托管程序集,并使用反射API处理这些托管类型(使用tlbimp将非托管类型转换为托管类型)

如何在.NET framework中获得与Win32相同的功能

我知道MS提供了一个导出表读取API,但我找不到Win32非托管代码互操作的确切API。

是的,请查看

使用的服务,您可以与本机Win32代码或导出C类型函数的任何DLL进行互操作。


请参阅。

请注意答案旁边的复选标记。这就是你如何接受最符合你问题需要的答案。另外,请注意上下箭头。这用于向上投票选出好的问题和答案,向下投票选出坏的问题和答案。向上或向下箭头显示了什么…?每个问题和答案旁边是一个数字。这就是用户认为它有多好。数字上方为灰色向上箭头,下方为向下箭头。如果您发现问题或答案有帮助,请单击向上箭头。如果您发现它特别没有帮助,可以单击向下箭头。当你提问时,所有答案都会打勾。对于最能回答您问题的答案,您可以单击复选标记将其选为最佳答案。这也有助于未来的观众解决类似的问题,就像这些答案对您个人有帮助一样。System.Runtime.InteropServices使您能够从TypeLib或其他类型中获取要提取的类型(例如,您可以提取二进制定义的完整签名)但是您需要在运行时了解类型,并在运行时调用这些方法。在Win32的情况下,我们可以通过读取PE(普通Win32 DLL)的导出表和头来提取类型和签名,现在在运行时调用这些方法,就像在COM使用反射的情况下调用这些方法一样。但是反射只应用于托管程序集。对我来说,普通win32 DLL无法转换为托管程序集。不,您无法自动生成p/invoke声明,因为本机代码没有足够的元数据。指向pinvoke.net的链接为许多Win32 API提供了大量现成的互操作声明。对于非Win32 API,您可以遵循相同的模式,但需要手动执行。对我来说,PInvoke只是非托管世界的呼叫转发器,它不做任何其他事情。运行时不进行类型检查。是不是?@Usman,在.NET端,类型非常重要。互操作服务使用类型信息和各种属性来确定如何正确地将数据(参数和返回值)从托管世界传递到非托管世界并返回。