Unmanaged Exports 是一个将.NET编写的静态托管函数导出成可供C/C++等直接调用的非托管函数的工具。
它是如何工作的?
创建一个新的或者修改已经存在的类库。
然后加入 UnmanagedExports Nuget 包。
这基本就是所有要做的事情了。
然后你就可以随便写一些静态方法,用[DllExport]装饰它,然后在原生代码中使用了。
它很像 DllImport,你可以用MarshalAsAttribute来定义该函数的参数和结果的格式。
在编译时,这个工具会自动修改IL代码增加导出声明。
限制
你不能导出在同一个class中的重载函数,即便你指定了不同的导出名称。
另一个限制是你不能递归调用导出函数。
这看起来是运行时的限制,并且我并不想为了规避这些限制而再把你的函数做一次包装。
关于编译错误
该工具在非英文操作系统上可能会出现编译错误的问题,具体表现如下:
主要原因是因为非英文操作系统中IL代码中含有非英文注释导致插件工作异常。
虽然将系统语言切换成英文可以解决这个问题,但是这个方法过于麻烦,故本人修改了这个工具,修正了其在非英文操作系统上不能正常使用的问题。
文末附上修改后的文件,解压后将其中的两个dll替换进项目NuGet包中packages\UnmanagedExports.1.2.7\tools文件夹下的两个同名dll即可。
改修正版仅针对Unmanaged Exports 1.2.7版本制作,其它版本未测,可能不能正常使用。
替换完成后即可正常编译:
下载地址见二楼
它是如何工作的?
创建一个新的或者修改已经存在的类库。
然后加入 UnmanagedExports Nuget 包。
这基本就是所有要做的事情了。
然后你就可以随便写一些静态方法,用[DllExport]装饰它,然后在原生代码中使用了。
它很像 DllImport,你可以用MarshalAsAttribute来定义该函数的参数和结果的格式。
在编译时,这个工具会自动修改IL代码增加导出声明。
限制
你不能导出在同一个class中的重载函数,即便你指定了不同的导出名称。
另一个限制是你不能递归调用导出函数。
这看起来是运行时的限制,并且我并不想为了规避这些限制而再把你的函数做一次包装。
关于编译错误
该工具在非英文操作系统上可能会出现编译错误的问题,具体表现如下:
主要原因是因为非英文操作系统中IL代码中含有非英文注释导致插件工作异常。
虽然将系统语言切换成英文可以解决这个问题,但是这个方法过于麻烦,故本人修改了这个工具,修正了其在非英文操作系统上不能正常使用的问题。
文末附上修改后的文件,解压后将其中的两个dll替换进项目NuGet包中packages\UnmanagedExports.1.2.7\tools文件夹下的两个同名dll即可。
改修正版仅针对Unmanaged Exports 1.2.7版本制作,其它版本未测,可能不能正常使用。
替换完成后即可正常编译:
下载地址见二楼