我需要从一个dll中包含的C api调用一个函数.功能原型如下......
int func( char* name, void* value );
Run Code Online (Sandbox Code Playgroud)
其中指针值的内容可以引用依赖于传递名称的任何类型.我不确定如何设置Dll inport来正确地编组这个空洞*.我一直在尝试使用IntPtr,这似乎适用于值为int但我无法正确检索浮点值等值.
我想尝试导入这样的功能......
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func( string name, ref IntPtr value );
Run Code Online (Sandbox Code Playgroud)
请注意,值是输出.指向任何类型值的指针,即已知类型值(调用者已知)的全局内存区域中的地址.在ac prog中,调用者将被期望将此void*转换为所需类型并取消引用以获得存储在那里的实际值.到目前为止给出的答案似乎是基于一个假设,即函数会将结果写入传入的指针位置.我的错误,因为我没有太具体.抱歉.C#不是我的包,我甚至都不知道IntPtr是否可以去这里......
Han*_*ant 10
解决这个问题的最好方法是提供函数的重载,这样C#端的所有内容都是干净利落的.像这样:
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func(string name, out int value);
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func(string name, out float value);
// etc, one each for each type
Run Code Online (Sandbox Code Playgroud)
您不需要ref-IntPtr是传递到本机代码的方式void*。
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func( string name, IntPtr value );
Run Code Online (Sandbox Code Playgroud)
编辑:C 代码可以使用输入写入所需的内存。您面临的问题是托管代码知道要为每种可能的返回值类型分配多少内存。然后,一旦托管代码处理完输出值, 就可以使用Marshal.AllocHGlobal或分配适当大小的块,并通过或Marshal.AllocCoTaskMem释放(根据您使用的分配方法) 。FreeHGlobalFreeCoTaskMem
有关示例,请参阅@Alex Farber 的回答。
| 归档时间: |
|
| 查看次数: |
6119 次 |
| 最近记录: |