Tag: 编组

使用C#中的参数打包IDispatch调用(使用DISPPARAMS)

我正在使用Invoke对支持IDispatch的旧COM对象进行后期绑定。 这似乎是必要的,因为.NET的Type.GetMethod Type.InvokeMember似乎不适用于这些对象。 以下代码适用于从对象获取属性,调用者将属性名称作为字符串传递,以获取具有后期绑定的属性值。 该类在其构造函数中获取一个对象,并将this.idisp(和this.lcid)设置为该对象的接口指针(Critiques welcome!) public object InvokeGet(string propertyName) { int id = GetDispID(propertyName); IntPtr[] pArgErr = default(IntPtr[]); object pVarResult; System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams = default(System.Runtime.InteropServices.ComTypes.DISPPARAMS); System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo = default(System.Runtime.InteropServices.ComTypes.EXCEPINFO); Guid guid = new Guid(); int result = this.idisp.Invoke(id, ref guid, (uint)this.lcid, (ushort)System.Runtime.InteropServices.ComTypes.INVOKEKIND.INVOKE_PROPERTYGET, ref pDispParams, out pVarResult, ref pExcepInfo, pArgErr); if (result != 0) { throw […]

从C#调用Delphi函数

我有一个下面的DLL源代码。 library Project1; uses System.SysUtils, System.Classes; type IStringFunctions = interface [‘{240B567B-E619-48E4-8CDA-F6A722F44A71}’] function GetMethodValueAsString():PAnsiChar; stdcall; end; TStringFunctions = class(TInterfacedObject, IStringFunctions) public function GetMethodValueAsString():PAnsiChar; stdcall; end; {$R *.res} function TStringFunctions.GetMethodValueAsString():PAnsiChar; stdcall; begin Result := ‘test’; end; procedure GetImplementation(out instance:IStringFunctions); stdcall; export; begin instance := TStringFunctions.Create; end; exports GetImplementation; begin end. 我想在C#中使用这样的 using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; […]

C#格式化外部Dll函数参数

我还没有找到关于这个主题的好参考。 对于这个例子,我们将采用一些我试图移植到C#的C ++代码。 在C ++领域,我们有一个外部库函数的原型: extern “C” DWORD EXPORT FILES_GetMemoryMapping( PSTR pPathFile, PWORD Size, PSTR MapName, PWORD PacketSize, PMAPPING pMapping, PBYTE PagesPerSector); 并在其中使用如下: FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector); 现在我正在尝试将第一行移植到C#,这里是我没有明确路径的地方。 这是我到目前为止所得到的: [DllImport(“Files.DLL”)] public static extern uint FILES_GetMemoryMapping( [MarshalAs(UnmanagedType.LPStr)] string pPathFile, out ushort Size, [MarshalAs(UnmanagedType.LPStr)] string MapName, out ushort PacketSize, IntPtr pMapping, out byte PagesPerSector); 现在的问题是:有没有好的指南告诉我“PSTR […]

如何在.NET应用程序中使用C ++项目?

我是一名常规.NET开发人员,旨在将C ++库集成到.NET项目中。 我有一些想法,但由于我一般都是C ++的新手,所以我不知道我正在尝试使用的技术的局限性。 C ++项目本质上是一个快速的声音渲染器,可以使用一堆不同的后处理技巧播放多轨音频文件。 所有这一切都很酷,但考虑到我想要集成一个简单的.NET WinForms应用程序,事情开始变得混乱。 首先,C ++项目没有.NET绑定或ActiveX / COM集成。 它是一个简单的’ol MS VC ++ 9项目。 如果我在我的.NET应用程序中使用该项目,我将不得不以某种方式与它进行交互 ,即。 创建类实例,设置属性,调用方法,编组进出数据等。 其次,它可以作为独立的Windows应用程序运行,并使用MS Windows API管理自己的Windows。 这很好,但不知怎的,我需要在后台运行 .NET VM,管理节目并运行我所有的C#代码。 我不编写C ++所以我需要坚持使用C#来围绕这个lib构建一个应用程序。 第三,无论我是否在与C ++ lib相同的进程中运行,我都需要一种方法来构建/接口/调试这两个独立的应用程序,就像它们是一个一样。 我没有C ++编程的背景,除了我为高性能数据操作编写了几个C ++ DLL。 所以,很多问题,不知道如何开始! 我可以完全编译这个lib并将其放入VC EXE,但是如何将我的.NET代码共同编译成它? 或者,如何将C ++代码编译到.NET EXE中,以便它在托管环境中运行? 请注意,它不是为此设计的,如果我尝试改变太多,可能会行为不端。 主要问题是与它接口 。 如何公开一些要从.NET访问的C ++类? 我确切地知道我需要哪些类,并且我只需要几十个类以及它们可以从.NET获得的相关方法/属性。 我不介意.NET中的手写包装类来帮助.NET VM理解来回传输的字节的类结构。 我希望我可以直接使用托管环境中的C ++对象,因此我的大多数代码都可以保留在.NET中。 即使我作为一个独立的应用程序运行它,我是否必须求助于套接字或与之通信? 这是绝对更糟糕的情况,我会做任何事情来避免这种情况。 任何帮助或指示都表示赞赏,我希望我能够完成自己的工作并完成我的任务,并且我的问题足够具体并且可以回答。 谢谢你的帮助! […]

编组C#/ C ++之间的复杂结构

我正在尝试从C ++填充结构数组并将结果传递回C#。 我想也许创建一个结构数组的结构可能是前进的方式,因为大多数例子我遇到了使用结构(但传递基本类型)。 我试过以下但到目前为止没有运气。 在以下url找到了一个例子: http : //limbioliong.wordpress.com/2011/08/20/passing-a-pointer-to-a-structure-from-c-to-c-part-2/?relatedposts_exclude = 542 我在C#中有以下内容 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace CSharpDLLCall { class Program { [StructLayout(LayoutKind.Sequential,Pack=8)] public struct Struct1 { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public double[] d1; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public double[] d2; } [StructLayout(LayoutKind.Sequential)] public struct TestStructOuter { public int length; […]

我正在尝试编组从C到C#的结构,不知道从哪里开始

我在C ++中的结构如下 /* this structure contains the xfoil output parameters vs angle of attack */ typedef struct xfoil_outputdata_struct { double *pAlfa; double *pCL; double *pCM; double *pCDi; double *pCDo; double *pCPmax; long nEntries; } XFOIL_OUTPUT_DATA; /* Here are the function prototypes for XFoil */ __declspec(dllexport) XFOIL_OUTPUT_DATA *xfoilResults(); /* get output from xfoil */ 我使用XFoilResults将这个结构拉回到C#中 我的DLL […]

Marshal.StructureToPtr失败了bool和固定大小的数组?

如果我用StructureToPtr封送这个结构然后再用PtrToStructure解组它,我的第一个节点有y = {1,2},而我的第二个节点有y = {1,0}。 我不知道为什么,也许我的结构在某种程度上是坏的? 从结构中删除bool使其工作。 using System; using System.Runtime.InteropServices; namespace csharp_test { unsafe class Program { [StructLayout(LayoutKind.Sequential)] public struct Node { public bool boolVar; public fixed int y[2]; } unsafe static void Main(string[] args) { Node node = new Node(); node.y[0] = 1; node.y[1] = 2; node.boolVar = true; int size = sizeof(Node); […]

在.NET中解析普通的Win32 PE文件(Exe / DLL)

我需要解析普通的Win32 DLL / Exe并从中获取所有导入和导出以在控制台或GUI(即Win Forms)上显示。 是否可以通过读取其导出/导入表并从中获取托管类型来解析C#.NET中的Win32 DLL / Exe? 由于它是非托管PE,.NET不允许您将非托管PE文件转换为托管.NET程序集,它只生成COM托管程序集。 如何解析这些表并以托管forms获取所有方法(签名)。 (例如,如果char *作为参数,它应显示为IntPtr)。

将浮点数组编组到c#

我正在尝试编组一个包含从C ++ DLL到C#的float-Array的结构。 我从以下代码创建了C ++ DLL: //MarshalTest.h namespace mTest{ typedef struct { float data[3]; int otherStuff; } dataStruct; extern “C” __declspec(dllexport) dataStruct getData(); } //MarshalTest.cpp #include “MarshallTest.h” using namespace std; namespace mTest{ dataStruct getData(){ dataStruct d = {{ 16, 2, 77 }, 5}; return d; } } 我使用以下代码使得C#中的getData-Function可用: public unsafe struct dataStruct{ public fixed byte […]

如何将字节数组作为UDT属性从VB6 / VBA传递到C#COM DLL?

我有一个C#库,我正试图向VBA公开。 我可以很好地将参数传递给函数(即“ref byte [] someArray”),但传递对象或结构只是不起作用。 如果我尝试传递一个字节数组作为类的属性,我在VB-中得到以下错误 标记为受限制的函数或接口,或者该函数使用Visual Basic中不支持的自动化类型 如果我尝试传递一个字节数组作为结构的属性,我在VB-中得到以下错误 我已经打了两天了,而且我一直在寻找那些声称有答案的post,但是没有一个能为我效力。 所以这是我目前的代码: [ComVisible(true)] [Guid(“7F53F7A5-15C9-4A99-A855-38F5E87702D0”)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] // Tried as InterfaceIsDual and as InterfaceIsIDispatch public interface IDetail { [DispId(1)] // Tried with and without these int SomeInt { get; set; } [DispId(2)] string SomeString { get; set; } [DispId(3)] byte[] SomeByteArray { return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] get; […]