当C托管CLR时,如何从C#调用本机C

当C托管CLR时,如何从C#调用本机C,c#,unmanaged,C#,Unmanaged,我有一个C程序,可以托管CLR并调用C#方法。(我正在使用HostFxr。)我现在想从C#调用一个本机C函数。网上有一些例子,但是我找不到任何关于C程序承载CLR的例子。我在Linux上做这个 任何指点都将不胜感激 谢谢 Blake McBride尝试使用外部“C”\uuuuu属性((可见性(“默认”))装饰C函数,然后使用[dlliport]和包含该函数的应用程序二进制文件的名称。谢谢。首先,我使用C,而不是C++。其次,我的应用程序正在托管CLR.1–在本例中,请删除“C”。我认为这两件事无

我有一个C程序,可以托管CLR并调用C#方法。(我正在使用HostFxr。)我现在想从C#调用一个本机C函数。网上有一些例子,但是我找不到任何关于C程序承载CLR的例子。我在Linux上做这个

任何指点都将不胜感激

谢谢


Blake McBride

尝试使用
外部“C”\uuuuu属性((可见性(“默认”))
装饰C函数,然后使用
[dlliport]
和包含该函数的应用程序二进制文件的名称。谢谢。首先,我使用C,而不是C++。其次,我的应用程序正在托管CLR.1–在本例中,请删除
“C”
。我认为这两件事无关紧要。当您要求
dlopen
加载已加载到当前进程中的二进制文件时,您将获得旧实例,而无需执行任何磁盘IO,即速度非常快。我认为它应该也适用于主二进制。很可能还有另一种更惯用的方法。然而,我很确定它的实现更复杂<代码>[DllImport]在所有平台上都很快,并且被.NET运行时库广泛用于调用各种操作系统组件。我有点怀疑[DllImport]能否正常工作,因为我需要在上下文中进行调用。这意味着在调用C时,C环境中的任何全局变量都应该对被调用的C函数可用。请尝试使用
extern“C”\uu属性((可见性(“默认”))
来装饰C函数,然后使用包含该函数的应用程序二进制文件的名称来使用
[dlliport]
。谢谢。首先,我使用C,而不是C++。其次,我的应用程序正在托管CLR.1–在本例中,请删除
“C”
。我认为这两件事无关紧要。当您要求
dlopen
加载已加载到当前进程中的二进制文件时,您将获得旧实例,而无需执行任何磁盘IO,即速度非常快。我认为它应该也适用于主二进制。很可能还有另一种更惯用的方法。然而,我很确定它的实现更复杂<代码>[DllImport]在所有平台上都很快,并且被.NET运行时库广泛用于调用各种操作系统组件。我有点怀疑[DllImport]能否正常工作,因为我需要在上下文中进行调用。这意味着在C环境中调用C#时的任何全局变量都应该可用于被调用的C函数。