C# P/Invoke方法类型签名错误

C# P/Invoke方法类型签名错误,c#,pinvoke,C#,Pinvoke,我有一个非托管函数(它将另外三个函数作为参数,这使它更加混乱,因为VS没有说明哪个函数是问题所在)。NET运行时声称,至少有一个签名与P/Invoke不兼容(尽管我非常确定我已整理了所有非琐碎的内容) 下面是我的代码(其中TokenType是一个巨大的枚举,Failure是一个小的枚举): 当我用一些委托调用CreateLexer时,运行时错误就消失了。我看到的其他答案都是关于结构中的固定大小数组,我没有 有什么建议吗?好的。原来元帅拒绝了 [StructLayout(LayoutKind.Se

我有一个非托管函数(它将另外三个函数作为参数,这使它更加混乱,因为VS没有说明哪个函数是问题所在)。NET运行时声称,至少有一个签名与P/Invoke不兼容(尽管我非常确定我已整理了所有非琐碎的内容)

下面是我的代码(其中TokenType是一个巨大的枚举,Failure是一个小的枚举):

当我用一些委托调用CreateLexer时,运行时错误就消失了。我看到的其他答案都是关于结构中的固定大小数组,我没有


有什么建议吗?

好的。原来元帅拒绝了

[StructLayout(LayoutKind.Sequential)]
public struct Token {
    public Range location;
    public TokenType type;
    [MarshalAs(UnmanagedType.LPStr)]
    public string value;
}

显然,您必须在结构上显式指定字符集,即使LPStr文档清楚地说明了预期的编码。一旦我在结构上设置CharSet=CharSet.Ansi,封送员就拒绝了其他东西。

在哪里定义了
Failure
?@Damien:哦,这是一个枚举。如果您愿意,我可以发布内容。it和
TokenType
是您(在我看来)显示的内容中没有明显显示的两项,没有提供源代码的复制。这里有很多麻烦,太多的intptr、委托类型看起来太可疑,没有一个声明它们为cdecl的属性和返回结构的函数。不要试图一次完成所有的工作,从小事做起。@HansPassant:如果调用过C函数,没有声明cdecl几乎肯定是个问题。不幸的是,我添加了这样的属性,这似乎不是问题所在。我可以发布更多的示例代码,但是其他互操作的东西还没有实现。代理的值是否可能是一个问题?我假设每个与类型签名匹配的委托都会以相同的方式行事,但是如果一些委托在这里有特殊行为(我使用了lambdas),这就解释了为什么没有repro。
[StructLayout(LayoutKind.Sequential)]
public struct Token {
    public Range location;
    public TokenType type;
    [MarshalAs(UnmanagedType.LPStr)]
    public string value;
}