Tag: c ++ cli

今天如何在C#中接近不可为空的引用类型?

我读过很多不可空的问题和答案。 看起来在C#(4.0)中接近不可空类型的最佳方法是Jon Skeet的NonNullable hack。 但是,似乎C ++ / CLI通过支持托管引用解决了大部分问题: Foo% (而不是本机C ++ Foo& )。 编译器通过向参数添加modreq(IsImplicitlyDereferenced)来完成此工作。 试图从C#调用这样的函数会导致: ” is not supported by the language 有没有比NonNullable 更好的东西? 有没有办法(合理地 – 即,没有使用reflectionFoo::Method(Bar%)从C#调用C ++ / CLI方法Foo::Method(Bar%) ? [编辑]似乎目前没有什么比NonNullable 更好…我希望我会对C ++ / CLI的东西有一些评论,因为它已经至少有一个部分解决方案。

强名称validation失败

两台机器。 使用.NET 3.5和VS 2008 VC ++ SP1可再发行组件 一个使用两个签名DLL的​​exe,一个在C ++ / CLI中,另一个在C#中 exe在一台机器上加载并运行良好。 另一方面,我在C ++可执行文件中得到“强名称validation失败”(HRESULT 0x8013141A) 有任何想法吗?

从C#,C ++ / CLI和C ++共享枚举

我有一个由三部分组成的库。 首先是本机C ++,它提供实际function。 其次是C ++库的C ++ / CLI包装器/适配器,以简化C#到C ++的转换。 最后我有一个C#库,它通过C ++ / CLI适配器调用C ++库。 现在我有两组并行枚举定义,一个存储在.cs文件中,另一个存储在.h文件中。 这带来了双重问题: 我有双重维护。 我必须始终在两个文件位置同步枚举的更改。 两个枚举使用的命名空间应该相同,但C ++ / CLI包装器(它们查看两组枚举并在它们之间进行转换)会引发命名冲突。 现在我不确定这样或那样的解决方案可以解决这两个问题。 思考?

如何从C#访问C ++ / CLI中的类?

我正在用C#编写GUI工具来解析和显示用C编写的另一个程序的数据输出。为了解析数据,我需要知道在多个C头文件中指定的数据结构。 因此,我需要将这些C头文件合并到我的C#项目中。 我的问题是: 1)经过一些研究后我得出结论,最好的方法是在我的解决方案中创建一个新的C ++ / CLI项目,将C头文件导入到这个新项目中,编写一些C ++ / CLI类作为数据的薄包装器在C头文件中定义的结构,然后从C#代码引用C ++ / CLI包装器类。 这是最好的方法,还是有更好的方法? 2)我遇到了参考问题。 这是我的简化代码来说明问题: C ++ / CLI项目中的原始C头 #define ABC 0x12345 C ++ / CLI项目中的包装类 #include “my_c_header.h” namespace C_Wrappers { public ref class MyWrapper { public: property unsigned int C_ABC { unsigned int get() { return ABC; } } } } C#项目中的用户类 using […]

从C ++,反向P /调用,混合模式DLL和C ++ / CLI调用C#

据我了解,我可以使用反向P / Invoke从C ++调用C#。 反向P / Invoke只是一个例子: 创建托管(c#)类。 创建一个c ++ / cli(以前管理的c ++)类库项目。 使用它来调用托管c#类(可能通过引用)。 从本机c ++调用c ++ / cli代码。 问题: 它是否正确? 在步骤2中创建的DLL是否称为混合模式DLL? 就MS而言,C ++ / CLI是否完全取代了托管C ++? COM完全避免使用这种方法吗? CLR将在什么时候创建和运行,由谁来创建和运行? 提前致谢

如何将C#和C ++程序集链接到单个可执行文件中?

我有VS2008解决方案包含一个项目,该项目生成一个C#可执行文件,该项目引用了一个生成包含C ++ / CLI和非托管C ++的DLL的项目。 我想将这些合并到一个可执行文件中,因为C ++ dll包含我想要嵌入主可执行文件的安全代码。 我不能使用ILMerge,因为dll包含托管代码和非托管代码。 建议的解决方案似乎是使用link.exe将C#程序集与C ++目标文件链接起来。 这就是我想要做的。 我手动编辑了c#可执行文件的项目文件以生成netmodule。 我在可执行项目中添加了一个构建后步骤,以运行link.exe将c#netmodule和已编译的C ++目标文件链接在一起,然后运行mt.exe来合并两个项目创建的程序集清单。 这运行成功,但是exe仍然包含对C ++项目的正常构建过程生成的dll中定义的c ++类型的引用和使用。 然后我在C ++ dll的项目设置中指定了/ NOASSEMBLY,因此它还生成了一个netmodule。 在C#项目中,我删除了对C ++项目的引用,但在解决方案中添加了项目依赖项。 我手动编辑了C#项目文件,包含类似于: 即引用现在由C ++项目生成的C ++ netmodule。 但是,现在我的post build事件中的链接器步骤失败了: error LNK2027: unresolved module reference ‘librarycode.netmodule’ fatal error LNK1311: 1 unresolved module references: 这完全可以理解,因为我没有链接到librarycode netmodule; 我正在链接用于生成netmodule的C ++目标文件。 简而言之,如何将ac#executable和C ++目标文件合并到一个程序集中? 我错过了什么? 到目前为止,我的引用源(来自MSDN上的link.exe命令链接引用等)是以下两篇文章: http://blogs.msdn.com/texblog/archive/2007/04/05/linking-native-c-into-c-applications.aspx http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx我有一个演示解决方案,显示我的工作到目前为止,如果这有帮助。 非常感谢你提前。 […]

如何从C#调用C ++代码

我有C ++代码。 该代码包含Windows移动GPS启用/禁用function。 我想从C#代码调用该方法,这意味着当用户单击按钮时,C#代码应调用C ++代码。 这是用于启用GPSfunction的C ++代码: #include “cppdll.h” void Adder::add() { // TODO: Add your control notification handler code here HANDLE hDrv = CreateFile(TEXT(“FNC1:”), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (0 == DeviceIoControl(hDrv, IOCTL_WID_GPS_ON, NULL, 0, NULL, 0, NULL, NULL)) { RETAILMSG(1, (L”IOCTL_WID_RFID_ON Failed !! \r\n”)); return; } CloseHandle(hDrv); return (x+y); […]

调试C ++ / Cli:,没有本地

我正在尝试使用C#程序集和C ++ / Cli程序集调试项目。 C#中定义的接口由C ++ / Cli类inheritance,后者又调用本机C ++类。 在C ++和C#程序集以及启动.exe中都启用了混合模式调试。 现在,当我尝试调试C ++部分时,它变得棘手; 如果我只是简单地在C ++部分设置断点,它们就不会被击中(尽管事实上我知道它们被击中了,因为写入了日志(等)并抛出exception,实际上它会正确地抛出它)。 当我在调用混合模式程序集之前在C#的最新调用中设置断点时,我可以进入C ++ / Cli代码,甚至进入本机部分。 但是,调用堆栈显示为 MyMixedMode.dll! Line … 并且我无法检查任何本地人(本机代码中的本地视图只是空的)。 我有什么想法可能做错了吗?

为什么WPF设计器无法加载调用非托管DLL的库?

我正在使用Visual Studio 2008,.NET 3.5 SP1,并拥有一个包含以下模块的测试应用程序: 一个C ++ DLL 使用#1的C ++ / CLI DLL 使用#2的C#WPF应用程序 当我尝试使用#2中的类作为WPF XAML中的资源时,设计师不会让我: <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:lib1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" <- ERROR 错误是:“找不到程序集’ClassLibrary1’。确认您没有错过程序集引用。另外,请validation您的项目和所有引用的程序集是否已构建。” 但是当我在应用程序主窗口的代码隐藏中使用C ++ / CLI DLL中的类时,一切正常。 创建了Class1,并在其构造函数中调用C ++ DLL,没问题。 using ClassLibrary1; … public partial class Window1 : Window { public Window1() { InitializeComponent(); //use in code-behind Class1 tmp = new Class1(); tmp.FirstName […]

System.Double 是什么意思

这个gem是在我们反编译的一些互操作代码中创建的。 我们无法弄清楚如何创建这个数组的实例,也不知道它是什么类型的数组。 查看Type.GetElementType ,我发现它是一个Double类型的数组,但我们无法弄清楚它与System.Double[]不同之处。