- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个包含公开函数的 c dll,它接受三个参数:
int ParseInput(char* opt_path, char* input, SENNA_RESULT_ARRAY* result);
我想从 C# 调用它,它确实有效。问题是结果结构不受影响。这是用 C 代码定义的结构:
typedef struct RESULT_
{
char* word;
int pos_start;
int pos_end;
char* pos;
char* chk;
char* ner;
char* psg;
} RESULT;
typedef struct RESULT_ARRAY_
{
int size;
RESULT* Results;
} RESULT_ARRAY;
和我的 C# 代码:
[StructLayout(LayoutKind.Sequential)]
public struct SENNA_RESULT
{
[MarshalAs(UnmanagedType.LPStr)]
public string word;
[MarshalAs(UnmanagedType.I4)]
public int pos_start;
[MarshalAs(UnmanagedType.I4)]
public int pos_end;
[MarshalAs(UnmanagedType.LPStr)]
public string pos;
[MarshalAs(UnmanagedType.LPStr)]
public string chk;
[MarshalAs(UnmanagedType.LPStr)]
public string ner;
[MarshalAs(UnmanagedType.LPStr)]
public string psg;
}
[StructLayout(LayoutKind.Sequential)]
public struct SENNA_RESULT_ARRAY
{
public SENNA_RESULT[] Results;
public int size;
}
[DllImport("Senna-32.dll", CharSet = CharSet.Ansi)]
static extern int Parse(string msg, string stream, ref SENNA_RESULT_ARRAY results);
Parse(@"path", "sentence", ref result_array)
我尝试了很多东西,比如:1-使用类而不是没有 ref 关键字的结构2-使用指针而不是传递结构
每次我遇到不同的错误,比如数组不是指定类型低级错误(损坏的堆)
即使我没有在第一个结构中指定数组,size 成员也没有正确的值(C 代码在控制台中打印该值)
有什么建议吗?
谢谢
最佳答案
考虑使用下面的代码。
[StructLayout(LayoutKind.Sequential)]
public struct SENNA_RESULT
{
public IntPtr word;
public int pos_start;
public int pos_end;
public IntPtr pos;
public IntPtr chk;
public IntPtr ner;
public IntPtr psg;
}
[StructLayout(LayoutKind.Sequential)]
public struct SENNA_RESULT_ARRAY
{
public IntPtr Results;
public int size;
}
[DllImport("Senna-32.dll")]
static extern int Parse(string msg, string stream, out SENNA_RESULT_ARRAY results);
这是用法示例
SENNA_RESULT_ARRAY array = new SENNA_RESULT_ARRAY();
int result = Parse("path", "sentence", out array);
if (result == SUCCESS && array.Results != IntPtr.Zero)
{
for (int index = 0; index < array.size; index++)
{
IntPtr offset = (IntPtr)((int)array.Results + index * Marshal.SizeOf(typeof(SENNA_RESULT)));
SENNA_RESULT senna = (SENNA_RESULT)Marshal.PtrToStructure(offset, typeof(SENNA_RESULT));
}
}
我希望你明白这只是一个想法。确保代码工作正常,然后对其进行改进,使其更易于使用。我说的是用 string
替换 IntPtr
。
关于c# - dllimport : c code affect a struct passed by reference (c#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635382/
我一直在寻找一种在 EF Core 中编写“通用”更新方法的解决方案,该方法更新实体的所有已更改属性,包括相关集合。这样做的原因是我将实体名称的翻译存储在不同的表中。我找到了 this解决方案一开始似
我将 Identity Core 1.0 与 ASP.NET MVC Core 1.0 和 Entity Framework Core 1.0 结合使用来创建一个简单的用户注册系统 this arti
我必须创建一个悬停效果,其中当一个选项卡悬停时,该选项卡的整个背景应该是白色的。但正如下面 SS 中所见, , 悬停效果仅应用于文本部分。 我还附上了 Chrome Web 开发人员的 CSS。 生成
我正在研究一个 Prolog 问题,包括计算列表元素的数量: count([], 0). count([H|T], N) :- count(T, X), N is X+1, N
在下面的代码中,在 #content 规则中,overflow:hidden 做了一些魔术来自动调整 div 的 width。我尝试在 #content 中手动将宽度设置为某个值,例如 10000px
所以我有一些 CSS 生成这个。 HTML代码如下。 Home A
我喜欢使用 Visual Studio 中的“在 Microsoft Exel 中打开查询”按钮在 Excel 中管理父子 TFS 链接。我可以在 Excel 中创建两个工作项之间的父子关系,方法是剪
我目前正在尝试提高构建机器的性能。标准构建在每次提交 (svn) 后排队,大约需要 40 分钟。如果提交时已经有一个排队的构建,我们不会添加另一个。所以每个构建都有 1+ 次提交的更改。由于提交可能没
在列出的 php 文档中 here有迹象表明该函数使用读取、错误和写入数组值作为引用,但我无法在任何地方找到这些值中实际发生的变化。 我写了一个我现在使用的简单“服务器”,我注意到当提到的函数无法看到
嗨,我正在尝试定位第一个 .current-cat-parent 下的元素,但我的 jquery 代码正在影响所有 这下面的元素。我怎样才能只定位第一个立即元素?谢谢! $(".current-ca
我有一张表,我在 data_id 上有自动编号/序列 tabledata --------- data_id [PK] data_code [Unique] data_desc 示例代码: ins
我已经创建了 JFormattedTextField 的自定义组件 (NumberFormattedTextField)。这是我使用的格式化程序: public static Internat
据我了解,Apple 应用程序更新将安装一个新的独立应用程序,而不是对现有应用程序应用补丁。 有谁知道这个过程的更多细节吗?这适用于用户的所有目录吗?任何文件夹(如私有(private)文档)都不会受
我有一个允许我定义 alpha 背景的 sass mixin @mixin background-rgba($r,$g,$b,$a) { $color: ie_hex($r,$g,$b,$a)
我正在网络抓取如下表中的文本数据,我想获得结果: Lorem ipsum dolor sit amet consectetur adipiscing elit, sed do eiusmod temp
我正在学习事件委托(delegate),但遇到了问题。 一开始我做初稿的时候,如果点击只会删除文字,不会删除按钮,所以我修改了它。后来,当点击容器div时,它删除了整个内容,所以我再次更改它。 现在它
这个问题在这里已经有了答案: Why is this inline-block element pushed downward? (8 个答案) Align inline-block DIVs t
父元素没有溢出属性。父元素具有设置的高度。无论我尝试什么,导航栏都不会粘住。它也不适用于 JavaScript。我肯定错过了什么。下面是代码。有人请告诉我我做错了什么: /* Body */ body
问题 我的页脚中有四列,每列宽度为 25%。 对于平板电脑,宽度变为 50% - 每行两个。 但是,我无法对齐前两列和后两列。 这是一张显示它们当前外观的图片: 我试图让它们看起来像: |------
我正在尝试为网站构建菜单,我使用了以下代码: nav#menu:hover li{ background-color: #606060; } 但是,当我将鼠标悬停在网站上的列表项上时,代码会更
我是一名优秀的程序员,十分优秀!