Tag: marshalling

Interop COM(-isch)接口封送会在简单调用时导致AccessViotlationException

我正在尝试为本机C ++插件标准编写托管互操作库。 此本机C ++库使用C​​OM兼容的接口设计。 但是,它不会做任何类注册的东西。 与COM一样,所有接口都派生自IUnknown(称为FUnknown,但无论如何都是相同的3种方法)。 我编写了一个简单的C ++控制台应用程序,它可以加载我的托管测试插件,并通过导出的方法检索初始(根)接口(对象工厂模式 – 与com类似)。 我使用第三方DllExport代码属性实现 – 这似乎工作正常。 C ++测试应用程序使用LoadLibrary / GetProcAddress并成功检索对该接口的引用。 我可以在托管导出函数中设置断点,并按预期命中。 然后C ++测试应用程序在IUnknown(部分)接口上调用AddRef,它返回2 – 正如预期的那样。 请注意,我的托管接口定义(counter-part)不是从IUnknown派生的 – 或者包含这些方法。 我想说这意味着托管编组魔法已经介入并提供了CCW。 然后C ++测试应用程序调用工厂接口上的一个简单方法 – 一个只返回一个int32 – 并且也到达托管实现(断点被命中),但是当该方法返回时抛出一个AccessViolationException – 在托管中的某处 – 无管理的过渡。 class IPluginFactory : public FUnknown { public: // removed other methods before and after this one virtual int32 PLUGIN_API […]

键入编组以从C#调用fortran子例程

我正在尝试使用P / invoke从C#代码调用FORTRAN77子例程 – 如果您感兴趣,我正在尝试包装ARPACK库提供的一些function( http://www.caam.rice。教育/软件/ ARPACK )。 我有两个问题。 首先,在这种情况下,我无法找到关于类型编组的任何地方的明确指示。 更具体地说,这是在我的FORTRAN子例程中声明的类型: subroutine getEigenVectors & ( Matrix, n, which, nev, ncv, maxn, maxnev, maxncv, ldv, v, d) c %——————% c | Scalar Arguments | c %——————% character which*2 integer n, nev, maxn, maxnev, maxncv, ldv c %—————–% c | Array Arguments | c %—————–% c Real […]

C#联盟结构编组

我正在尝试将Video4Linux集成到我的托管应用程序中。 事实上,我已经宣布了所有必需的结构和相对的ioctl 。 在这个问题中,我提出了两个ioctl : SetFormat和GetFormat ; 虽然前者工作得很好(就像我实际使用的那样),但后者却让我记忆力不好。 GetFormat ioctl实际上正在执行,但是一旦应用程序访问ioctl参数(调试器或我的应用程序本身),它总是会崩溃以下堆栈: System.NullReferenceException: … at System.String.mempy4(…) in :0 at System.String.memcpy(…) in :0 at Derm.Platform.Video4Linux.ControlGetFormat(…) in … 我对p /调用ioctl进行了一些调查,再一次,我无法理解为什么我的应用程序崩溃了。 我怀疑它是由于结构内存布局,但我无法解释为什么SetFormat工作而GetFormat不工作(因为他们使用相同的参数)。 我必须P / Invoke接收/返回结构v4l2_format的ioctl例程: struct v4l2_format { enum v4l2_buf_type type; union { struct v4l2_pix_format pix; /* V4L2_BUF_TYPE_VIDEO_CAPTURE */ struct v4l2_pix_format_mplane pix_mp; /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ struct v4l2_window win; /* V4L2_BUF_TYPE_VIDEO_OVERLAY […]

C ++和C#中的二进制序列化/反序列化

我正在开发一个分布式应用程序,它有两个组件。 一个用标准C ++编写( 不是托管C ++ ,在Linux平台上运行),另一个用C#编写。 两者都通过消息总线进行通信。 我有一种情况需要将对象从C ++传递到C#应用程序,为此我需要在C ++中序列化这些对象并在C#中对它们进行反序列化(类似于.NET中的编组/解组)。 我需要以二进制而不是XML(由于性能原因)执行此序列化。 我已经使用Boost.Serialization来实现这一点,当两端都是用C ++实现的,但现在我的一端有.NET应用程序, Boost.Serialization不是一个可行的解决方案。 我正在寻找一种解决方案,允许我跨C ++和.NET边界执行(反)序列化,即跨平台二进制序列化 。 我知道我可以在C ++ DLL中实现(de)序列化代码并在.NET应用程序中使用P/Invoke ,但我想保留它作为最后的手段。 另外,我想知道我是否使用像gzip这样的标准,这会有效吗? 除了gzip还有其他选择吗? 它们的优点/缺点是什么? 谢谢

C#和void指针

我正在编写我的第一个C#应用程序,但幸运的是我必须使用void指针(使用返回句柄的DLL)。 根据我的阅读,有几个选择: 不安全的代码,例如参见http://www.c-sharpcorner.com/UploadFile/gregory_popek/WritingUnsafeCode11102005040251AM/WritingUnsafeCode.aspx 在C#程序中写入我的函数declerations IntPtr而不是void *。 例如:public static extern char SupportsWhatever(IntPtr h); 使用ref,例如:public static extern char SupportsWhatever(ref h); 还应该注意,我需要在DLL和C#应用程序之间来回传递信息。 不安全的选项是第一个出现在谷歌上的选项,但出于某种原因,在我的所有function都感觉不对之前编写关键字unsafe。 有什么建议?

PInvoke和char **

我从我想在c#应用程序中使用的人那里得到了这个程序集。 标题看起来像这样: int __declspec(dllimport) s2o(WCHAR* filename, char** out, int* len); 我设法让它部分工作,使用: [DllImport(“s2o.dll”, EntryPoint = “?skn2obj@@YAHPA_WPAPADPAH@Z”, CallingConvention = CallingConvention.Cdecl)] public static extern int s2o( [MarshalAs(UnmanagedType.LPWStr)] string filename, ref char[] @out, ref int len ); 然后像这样调用它: char[] result = null; int length = 0; s2o(“filepath”, ref result, ref length); 它似乎部分起作用,因为“长度”实际上得到了一个值。 不幸的是,’结果’保持为空。 我应该怎么做才能使这个工作? 编辑: 好吧,我设法通过用IntPtr替换char []然后像Nick建议调用’Marshal.PtrToStringAnsi’来工作: string result […]

无法在Unity中编组从C ++到C#的结构数组

我正在尝试将C ++中的struct数组传递给C#中的Unity脚本。 当我在生产中使用代码时,数组的大小会有很大差异,所以我实际上需要传递一个未知长度的数组。 我的聪明想法是将数组存储在堆上,并将对该数组的引用传递给Unity。 我发现StackOverflow的post就是如何做到的。 但是然后Unity抱怨引用为null。 这是我的C ++代码的一部分: extern “C” struct S; // Not currently used. struct S { int i; float f; }; extern “C” bool helloWorld(S ** a, int * i); S * s; bool helloWorld(S ** a, int * i) { s = new S[4]; for (int j = 0; j < […]

C#委托中的Marshal va_list

我正在尝试从c#开始这项工作: C头: typedef void (LogFunc) (const char *format, va_list args); bool Init(uint32 version, LogFunc *log) C#实现: static class NativeMethods { [DllImport(“My.dll”, SetLastError = true)] internal static extern bool Init(uint version, LogFunc log); [UnmanagedFunctionPointer(CallingConvention.Cdecl, SetLastError = true)] internal delegate void LogFunc(string format, string[] args); } class Program { public static void Main(string[] args) { NativeMethods.Init(5, LogMessage); […]

如何制作WinApi函数的返回值?

简单:如何明确封送WinAPi函数的结果? 我知道如何在C#中编组WinApi函数的参数但是我如何编组返回值呢? 或者我真的要整理它们吗? 我理解WinAPi只返回BOOL或所有类型的INT (句柄在非托管代码中也是int)。 // common signature [DllImport(“kernel32.dll”, SetLastError = true, CharSet = CharSet.Ansi)] static extern int GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename); // my prefered signature because easy to handle the result [DllImport(“kernel32.dll”, SetLastError = true, CharSet = CharSet.Ansi)] static extern FileAttributes GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename); 因为FileAttributes是枚举的,并且每个值都可以很容易地转换为int所以我确信这个符号是安全的。 但是我可以像参与参数一样编组这个签名中的结果吗? 我实际上只知道Marshal类和MarshalAs属性。

将C#Jagged数据编组到C ++

我正在尝试将2D C#锯齿状数组( double[][] jaggedArray ) double[][] jaggedArray到C ++ dll中,我已将接收变量指定为double** 。 但是,我收到的消息是: 嵌套数组没有编组支持。 如果没有扁平化锯齿状arrays,有没有办法在C ++ dll中使用C#中的锯齿状数组?