Tag: 互操作

创建从C到C#的混合模式C ++桥接?

我希望有人可以帮助我,我主要是一个C#开发人员,所以我的C和C ++技能很糟糕。 我有一个原生C dll,它是一个更大的应用程序的插件。 我使用gcc在linux上交叉编译这个dll for windows。 在我创建D3DSurface的原生dll中,我想在混合模式C ++ dll中调用一个函数,并将指针传递给表面以及Hwnd / handle。 那混合模式C ++应该调用我的C#托管代码。 例如,在CI中要做以下事情; Hwnd handle; LPDIRECT3DSURFACE d3dtarg; SurfaceCreated(handle, d3dtarg); 在C#中我希望从混合模式程序集中调用它 public static class D3DInterop { public static void SurfaceCreated(IntPtr handle, IntPtr surface) { //do work } } 由于我吮吸C ++,我只想知道是否有人能给我一个我需要为混合模式dll编码的例子。 我也不想用directx头编译混合模式dll,那么有没有办法将’C’LPDIRECT3DSURFACE转换为通用指针? 在C#中我只是使用IntPtr。

C# – C互操作性

链接文本的Q / A非常接近我正在寻找的内容,但我只是开始使用C#并需要更多填写,并可能提供一些关于最佳方法的提示。 我有一个我用Javascript写的PalmPre / webOS的应用程序,其中一部分用C语言编写,以实现可移植性,而不是性能。 它做Lear Jet性能计算。 在webOS世界中,C代码(插件)进入自己的进程,JS有一种方法可以调用和调用C代码(使用’main’)来启动进程,C可以注册入口点。 然后JS可以使用一些参数调用入口点,C代码进行计算,然后C返回指向JS的数字字符串的指针以供显示。 C代码没有图形,没有动态内存分配等。我想基本上将JS GUI代码转换为C#,并使用C代码对C#进行小调整(#if’s)来做与JS相同的事情Pre现在做了。 答案1 / option2我认为最好,但我不明白他的意思是“你的项目与消费者项目”以及如何/为什么这意味着一个是dllimport,一个是dllexport,我没有DLL ,我只有C代码例程。 看起来我要做的就是用我的C例程替换他的’PublicFunc’,对吧? 我可以有一些args,它说’params’? 但是没有指定返回类型,我将如何返回C#的答案? “返回型”是一个保留字吗? 或者一个例子占位符? 或者我离开赛道因为我没有DLL? 顺便说一句,C代码确实有一种编译模式,可以独立运行作为DOS程序进行测试。 是否有任何简单的示例代码说明如何执行此操作? 我现在正在下载MS VS 2010 Express,还没有安装它。 也许那里有什么东西? TIA!

如何在C#中编组列表

我必须从C#向C ++发送一个列表.C#列表是ListMyList ,C ++代码接受它作为listcppList如何使用marshalas。 谢谢

将对象转换为void *并返回?

我正在尝试编写一个C函数的包装器,它需要一个函数指针和任意用户数据( void* )。 函数指针我已经弄清楚如何处理使用委托,但我无法弄清楚如何将object转换为void* 。 我可以把它变成一个ref object ,因为它的行为就像一个指针AFAIK,但是当我尝试它时,我得到一个像 在从非托管VARIANT到托管对象的转换过程中检测到无效的VARIANT。 将无效的VARIANT传递给CLR可能会导致意外的exception,损坏或数据丢失。 这个“解决方案”可能对我有用,但我认为必须有一种方法可以将任意数据传递给C DLL,以便以后可以传回来?

如何知道文件句柄号时打开文件?

我使用FileStream在C#中打开一个文件,然后我用这一行获得了文件句柄号: IntPtr file_handle = fs.SafeFileHandle.DangerousGetHandle(); 现在我想将此句柄传递给C ++代码并使用此句柄值来访问该文件。 这可能吗? 如何在C ++中仅使用文件句柄打开文件? 谢谢。 更新 我使用C#将P / Invoke转换为C ++ Win32 DLL(而不是COM DLL)。 我在C#中将文件作为FileStream打开,并将句柄传递给C ++。 这是我在C ++ DLL中的一些代码: extern “C” __declspec(dllexport)void read_file(HANDLE file_handle) { char buffer[64]; ::printf(“\nfile = %d\n”,file_handle); if(::ReadFile(file_handle,buffer,32,NULL,NULL)) { for(int i=0;i<32;i++) cout<<buffer[i]<<endl; } else cout<<"error"<<endl; } 这是我的C#代码: [DllImport(“…”,EntryPoint = “read_file”, CharSet = CharSet.Auto)] public static extern void […]

从C#调用C ++ DLL函数时出现问题

这是关于C#中的一个河豚问题的第三个主题。虽然我不能在我的应用程序中实现blowfish,但我决定将它用作外部C ++ DLL。 请注意我已经尝试过Blowfish.NET和其他任何一个,问题是我正在将代码从C ++转换为C#,而C#代码必须与C ++代码完全相同。 至今: —> C ++ DLL源码<— 请注意,导出的函数位于代码的末尾 C#代码(定义) [DllImport(“TestDLL.dll”, EntryPoint = “Initkey” ,ExactSpelling = true , CallingConvention = CallingConvention.Cdecl)] public static unsafe extern void Initkey(byte[] key); [DllImport(“TestDLL.dll”, EntryPoint = “encode”, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] public static unsafe extern void encode(UInt32 *stream); C#代码(函数调用) – 初始化河豚钥匙 UInt32[] keyarray = new […]

编写旨在从C#调用的C ++?

所以我这样做是一个学习时刻,我不怕说我不知道​​我在这里做什么。 值得一提的是,在这种情况下我对C ++知之甚少。 在C#中,我已经多次使用DllImport从user32.dll或其他我未编写的DLL中引入内容,但我希望更好地理解另一半(C ++的一半)是如何实现的这发生了。 我所拥有的C ++代码很简单,只是为了validation调用是否成功完成: #include using namespace std; __declspec(dllexport) void HelloWorld() { cout << "Hello, World" << endl; } 我不知道__declspec(dllexport)的重要性是什么,但我在几个 网站上看到它并没有太多关于它的重要性。 我的C#与我之前做过的DllImport没有什么不同: [DllImport(“TestDLL.dll”)] static extern void HelloWorld(); static void Main(string[] args) { HelloWorld(); } 我编译了C ++ DLL并将其放在C#项目中,然后将其复制到bin文件夹中。 当我运行C#项目时,我在main函数内调用HelloWorld()得到一个EntryPointNotFoundException 。 我的猜测是我需要更改C ++代码或C ++项目的编译标志。 目前,“使用MFC”设置为“使用标准Windows库”,并且不使用ATL或CLR。 任何帮助将不胜感激。

从C#调用某些Excel VBA宏时出错

我一直在努力和搜索这个问题无济于事…我有一些测试宏在从Excel运行时工作得很好但是从C#调用时失败或不工作,使用互操作… 我正在使用MS Visual Studio 2012(在64位Windows 7上)创建一个控制台应用程序,它将调用用Excel 2007编写的VBA宏TestMacro()。 下面是调用宏的C#代码:(我基本上复制了在这里完成的操作从Visual C#.NET使用自动化运行Office宏 ) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Configuration; using System.Reflection; using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Core; namespace C#_Macro_Wrapper { class Program { static void Main(string[] args) { RunVBATest(); } public static void RunVBATest() { System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new […]

C DLL没有在C#中加载

我有一个简单的C DLL(不是COM)。 我还有一个运行它的C#2.0应用程序(dllimport)。 dll放在应用程序的exe中。 我知道dll是可以的,而且我的应用程序称它成功读取它,但是当我将它们移动到另一台计算机时它说它可以加载dll。 错误:“无法加载dll name.dll。此应用程序无法启动,因为应用程序配置不正确。” 我使用visual studio 2005来创建dll。 目标计算机是一个并排的计算机。 当我拿着并排的文件夹包含它没有运行的CRT。 谢谢

接受字节数组,vb6到C#interop

我正在做一个使用加密包装器来管理vb6的应用程序。 到目前为止,.net和interop部分是正常的,完全正常工作。 正如我的客户正在测试它,我只是有一个简单的问题: [ComVisible(true)] public SomeObjectComVisible GetThat(byte[] array){ … } 到目前为止,我使用了暴露给com或int和string的类型,直到现在都没有问题。 是否可以使用(.net) byte或chould我使用*char ? 当我将程序集标记为可见并注册到com interop时,它会为它创建一个包装器,或者我应该使用一些非托管类型? 啊,这是一个vb6,而不是vbscript。 太感谢了 对于那些寻求答案的人: public SomeObjectComVisible GetThat([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)]byte[] array) 问题在于数组。 http://msdn.microsoft.com/en-us/library/z6cfh6e6.aspx和http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx 任何非bittable类型都可以是一件苦差事。 您可以指定自己的类型,以便使用它们,您只需要使用它们 [ComVisible(true), ClassInterface(ClassInterfaceType.None), ProgId(“SomeNamespace.SomeClass”), Guid(“XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”)] 在课堂上 非常感谢大家。 很好的帮助