Tag: interop

使用Marshal.Copy的原生C ++浮点数组到C#浮点数组不适用于某些数据

在尝试将数组从C ++传递到C#时,我看到了一个非常奇怪的问题。 我正在使用Marshal.Copy(具体来说: https ://msdn.microsoft.com/en-us/library/a53bd6cz( v= vs.110).aspx)。 问题:从C ++到C#的float数组在结果数组中产生一些NaN 。 (注意:我在Unity游戏引擎的上下文中工作) 码 示例C ++代码: extern “C” bool UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API getSomeFloats(float** points, int* count) { std::vector results; std::vector key_points = for (auto iter = key_points.begin(); iter < key_points.end(); iter++) { results.push_back(static_cast(iter->pt.x)); results.push_back(static_cast(iter->pt.y)); } *points = results.data(); *count = results.size(); // return true; } 示例C#代码: [DllImport(“NativePlugin”)] private […]

我需要固定匿名代表吗?

我从C#应用程序调用CopyFileEx,并将匿名委托传递给LPPROGRESS_ROUTINE参数,以便获取有关文件复制进度的通知。 我的问题是,匿名代表是否需要固定以及为什么(或为什么不)。 此外,如果: CopyFileEx没有阻止。 如果我传入一个非匿名的代表。 谢谢!

在编组带有字符串的struct时出现PInvoke错误

我有一个C ++结构 struct UnmanagedStruct { char* s; // Other members }; 和一个C#结构 struct ManagedStruct { [MarshalAs(UnmanagedType.LPStr)] string s; // Other members } C ++库暴露 extern “C” UnmanagedStruct __declspec(dllexport) foo( char* input ); 而它是导入的 [DllImport(“SomeDLL.dll”, CharSet = CharSet.Ansi)] static extern ManagedStruct foo( string input ); 但是,当我调用此函数时,我得到了 MarshalDirectiveException未处理 方法的类型签名与PInvoke不兼容。 问题是,如果我从结构中删除char * s和字符串s,则此函数调用有效。

如何使用C#BackgroundWorker报告本机C ++代码的进度?

在我的Visual Studio解决方案中,我使用C#实现了UI,并且在本机C ++中实现了一些代码。 我使用BackgroundWorker类来实现报告执行长操作的进度。 如何使用BackgroundWorker报告本机C ++代码的进度? 换句话说,如何将C#代码重写为本机C ++并从C#调用获得的C ++代码? 如果无法直接重写下面的代码,那么了解其他等效解决方案可能会很好。 谢谢。 class MyClass { public void Calculate(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 0; i < StepCount; i++) { if (worker.CancellationPending) { e.Cancel = true; break; } // code which handles current iteration here worker.ReportProgress((i + 1) […]

Activator.CreateInstance()在VSIDE内部工作,但不在外部工作

我有一堆COM对象,它们都实现了相同的接口,并且需要在运行时从选项列表中创建其中一个。 由于我知道每个实现COM服务器的CLSID,因此这应该很容易。 但是,对于某个COM库的子集,如果我在VS2010 IDE中运行,我只能使这个工作。 这是我用来测试的整个程序: using System; namespace ComTest { class Program { static void Main(string[] args) { var clsid = “{E8978DA6-047F-4E3D-9C78-CDBE46041603}”; var type = Type.GetTypeFromCLSID(new Guid(clsid)); var obj = Activator.CreateInstance(type, true); Console.WriteLine(“Obj is {0}”, obj); } } } 只要我通过VS2010运行,我就可以为迄今为止尝试过的每个COM CLSID做这项工作。 无论是否附加调试器,无论是否附加了托管进程,我都会从CreateInstance获取System.__ComObject 。 当我从控制台窗口编译并运行此代码时,对于某些CLSID值,我得到: Unhandled Exception: System.Runtime.InteropServices.COMException: Creating an instance of the COM component with […]

使用Word Interop打印对话框打印

我正在尝试从我的C#代码中打印一个word文档。 我使用了12.0.0.0 Word Interop,我正在尝试做的是在文档打印之前弹出打印对话框。 我不是100%肯定所有这些的语法,因为我无法让我的代码工作:(任何想法? 提前致谢!

无法在COM客户端中添加引用COM?

创建一个COM服务器,然后我注册了它。 当我尝试在COM客户端中添加该COM服务器时,我无法添加,并且出现以下错误。 “无法添加对’COMTest’的引用 ActiveX类型库’c \ user \〜\ Debug \ COMTest.tlb’是从.NET程序集导出的,无法添加为引用。 添加对.NET的引用“ 任何人都可以告诉我这是什么错误。 我以两种方式注册COM,也来自VS,也尝试使用命令提示符。

使用COM Interopreflection

在互操作之后,我找回了一个COM对象。 我知道这个对象将是三个可能的COM类之一(Class1,Class2,Class3),但不知道哪个在运行时。 对该对象的reflection(interopObject.GetType())返回System .__ ComObject的基本RCW包装器。 我需要的是在对象上设置一些属性 – Text1,Text2,… Text30(实际名称,btw :)),它们存在于所有三个类中。 所以,问题是,我可以以某种方式获取对象的运行时类型(这将解决我的问题,但可能是不可能的,因为.net运行时可能没有该信息),或者我可以设置COM对象的属性盲目地 这是我当前的代码,它失败了: for ( int i = 1; i <= 30; i++ ) { ProprertyInfo pi =interopObject.GetType().GetProperty("Text" +i.ToString()) // this returns null for pi pi.GetSetMethod().Invoke(interopObject, new object[] { someValue }); } 感谢Marc,这三个进入我的永久噱头系列: private static object LateGetValue(object obj, string propertyName) { return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null, propertyName, new […]

p / invoke返回指向struct的指针的C函数

如何在C#中声明一个返回指向结构的指针的C函数? 我相信以下是一种方法,然后是Marshal.PtrToStructure来获得实际的结构值。 // C-function SimpleStruct * Function(void); // C# import [DllImport(“MyDll.dll”)] public static extern IntPtr Function(); 我对此是否正确? 还有其他方法可以实现同样的目标吗? (可以按值返回结构)

在C#中,如何调用返回包含字符串指针的非托管结构的DLL函数?

我得到了一个DLL(“InfoLookup.dll”),它在内部分配结构并从查找函数返回指向它们的指针。 结构包含字符串指针: extern “C” { struct Info { int id; char* szName; }; Info* LookupInfo( int id ); } 在C#中,如何声明结构布局,声明Interop调用,以及(假设返回非空值)使用字符串值? 换句话说,我如何将以下内容翻译成C#? #include “InfoLookup.h” void foo() { Info* info = LookupInfo( 0 ); if( info != 0 && info->szName != 0 ) DoSomethingWith( info->szName ); // NOTE: no cleanup here, the DLL is caching the lookup […]