Tag: interop

在c#中以编程方式设置dllimport

我在我的解决方案中使用DllImport 。 我的问题是我有两个版本的相同的DLL一个为32位而另一个为64位。 它们都使用相同的名称和相同的签名来公开相同的function。 我的问题是我必须使用两个静态方法来暴露这些,然后在运行时使用IntPtr大小来确定要调用的正确方法。 private static class Ccf_32 { [DllImport(myDllName32)] public static extern int func1(); } private static class Ccf_64 { [DllImport(myDllName64)] public static extern int func1(); } 我必须这样做,因为myDllName32和myDllName64必须是常量,我没有找到在运行时设置它的方法。 有没有人有一个优雅的解决方案,所以我可以摆脱代码重复和常量IntPtr大小检查。 如果我可以设置文件名,我只需要检查一次,我就可以摆脱大量重复的代码。

访问Delphi DLL抛出exceptionexception

当我调用Dll方法时,它有时会引发exception,有时则不会。 我这样称呼它: public class DllTest { [DllImport(@”MyDll.dll”)] public extern static string MyMethod(string someStringParam); } class Program { static void Main(string[] args) { DllTest.MyMethod(“SomeString”); } } 我有时得到的例外是: AccessViolationException 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 有没有人知道我为什么有时会得到这个例外? 为什么有时会顺利运行?

如何编组一个可变大小的结构数组? C#和C ++互操作帮助

我有以下C ++结构 struct InnerStruct { int A; int B; }; struct OuterStruct { int numberStructs; InnerStruct* innerStructs; }; 还有一个C ++函数 OuterStruct getStructs(); 我如何将其编组为C#? C#定义的位置 struct OuterStruct { InnerStruct[] innerStructs; };

C#+ COM Interop,确定性发布

COM对象通常具有确定性破坏:在释放最后一个引用时释放它们。 如何处理C# – COM Interop? 这些类没有实现IDisposable ,所以我认为无法触发显式的IUnknown :: Release。 随意测试显示未引用的COM对象被懒惰地收集(即垃圾收集器触发释放)。 我应该怎样对需要被激活释放的OCM对象做什么? (例如持有大型或共享的关键资源)? 原始问题:我们使用COM库大量使用C#应用程序,并且它像疯了一样泄漏。 似乎问题是“在C ++和C#代码之间”(我们可以同时访问它们),但我们无法确定它。

在Windows 7上使用VB6注册Free Com

我有一些从VB6代码中使用的.NET代码。 我一直在XP机器上通过创建列出依赖.NET程序集的VB6.exe.manifest文件来开发它。 例如,假设我的2个.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,这里是VB6.EXE.manifest的样子(我使用的是version = 1.1.0.0,因为那是版本我在AssemblyInfo.cs中设置了.NET AssemblyVersion: 然后,与同一目录中的DLL一起,我有程序集和它们自己的清单文件。 这是一个示例“Some.Assembly.A.dll.manifest”: 我还在引用的DLL上运行tlbexp来创建TLB文件,这是我在VB6项目文件中引用的内容。 我想转移到Windows 7 64 BIT机器。 使用相同的方法,当我点击在WIN7机器上实例化.NET对象的VB6代码时,我得到了 “ActiveX组件无法创建对象。” 在XP上,它成功了。 如果我故意拼错VB6.EXE.manifest中的Dependent组件 – 在XP上我得到 “此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。” 在WIN7上,VB6只是加载。 它就像忽略了WIN7上的清单,所以我无法在WIN7上使用REG FREE方法加载我的.NET对象。 如果我regasm DLL,一切正常。 关于如何在WIN7(64位)上使用reg free com使VB6工作的任何想法?

如何在没有注册的情况下从Win32使用.Net程序集?

我想从Delphi Win32应用程序动态加载和使用在C#中创建的.Net程序集。 我的类和接口标记为ComVisible,但我想避免注册程序集。 这可能吗? PS我在这里找到链接文本关于该主题的另一个很好的讨论,但它更多地围绕托管CLR。 这引出了一个问题 – 为什么你要主持CLR而不是使用ClrCreateManagedInstance?

在构建服务器上注册COM引用的DLL

我们正在开发一个引用几个COM库的C#应用​​程序(例如AutoIT)。 我在源控件下包含所有引用的组件,在第三方“Libs”文件夹中。 问题是COM dll在.csproj文件中没有HintPath属性,我认为必须使用regsvr32(或使用某种脚本)手动注册这些属性。 我目前正在研究创建一个将在每次构建之前运行的MSBuild脚本,但是我无法弄清楚我应该手动调用regsvr32.exe还是使用一些预定义的MSBuild任务? 目前,这是我作为测试所支持的: 这会生成我在给定文件夹中放置的DLL不是有效DLL的错误。 什么是这个问题的好方法? 编辑: 引用COM dll的项目在.csproj文件中有类似的内容: {F8937E53-D444-4E71-9275-35B64210CC3B} 1 0 0 tlbimp False 这不包括任何提示路径作为其他托管程序集,因此在构建服务器上,找不到引用的COM dll。 使用REGSVR32在构建服务器上注册COM dll时,构建成功。

C ++ Interop:如何从本机C ++调用C#类,并且该类是非静态的?

我有一个用本机C ++编写的大型应用程序。 我还有一个C#课我需要打电话。 如果C#类是静态的,那么它将是微不足道的(Web上有很多例子) – 只需编写混合的C ++ / CLI包装器,导出接口,然后就完成了。 但是,C#类是非静态的,并且不能更改为静态,因为它有一个接口(如果您尝试使C#类静态,编译器将生成错误)。 有没有人遇到过这个问题 – 如何将非静态C#类导出到本机C ++? 更新2010-11-09 最终的解决方案:尝试COM,这很好用,但不支持结构。 所以,使用C ++ / CLI包装器,因为我绝对需要能够在C ++和C#之间传递结构。 我根据这里的代码编写了一个混合模式.dll包装器: 如何:使用C ++ Interop的Marshalarrays 如何:使用C ++ Interop的Marshal结构 由于目标类是非静态的,我不得不使用单例模式来确保我只实例化目标类的一个副本。 这确保一切都足够快,以满足规格。 如果你想让我发布一个演示项目,请联系我(虽然,公平地说,我从C ++调用C#,而现在大多数人都希望从C#调用C ++)。

从C#使用C库的提示

我在C中有一个库,我想用它来使用C#。 从我从互联网上收集的内容来看, 一个想法是用C ++ dll包装它,然后用DllImport包装它。 问题是我想调用的函数有一个相当讨厌的参数集:包括对函数的引用(这将是一个.NET函数),以及一些数组(一些写,一些读)。 int lmdif(int (*fcn)(int, int, double*, double*, int*), int m, int n, double* x, double ftol, double xtol, double gtol, int maxfev, double epsfcn, double factor) 鉴于这样的界面,我应该注意哪些恶意? (还有解决方案,请) 你为什么不…… – 用C#重写? 我开始了,但它已经从FORTRAN机器翻译了,我不太喜欢编码我无法理解的东西。 – 使用现有的.NET库 ? 我现在正在尝试,但结果并不完全相同 – 用C ++重新编译? 我正在考虑它,但它看起来很痛苦

从WinForms表单显示WPF窗口绝对安全吗?

我想从Windows窗体应用程序(.NET 3.5)中显示一个WPF窗口。 此代码似乎在示例项目中没有任何问题: public partial class WinFormsForm1 : Form { public WinFormsForm1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { WpfWindow1 w = new WpfWindow1(); w.Show(); } } 表单从Main()作为常规Winforms表单启动: Application.Run(new WinFormsForm1()); 在我看来这太容易成为现实。 这有什么缺点吗? 这样做安全吗?