C++/CLI->C#错误C2526:C链接函数不能返回C++类
我有一个使用VS2010 C#构建的简单.NET DLL,该c#揭示了两个类的静态成员 public class Polygon { public static void Test(int test) {} public static void Test(List test) {} } i然后从VS2010 C ++创建了一个控制台应用,并在_tmain上方添加了此功能 extern "C" void TestMe() { Polygon::Test(3); } 添加参考和编译给我这个错误 1>WierdError.cpp(9): error C2526: 'System::Collections::Generic::List::GetEnumerator' : C linkage function cannot return C++ class 'System::Collections::Generic::List
0 2024-04-15
编程技术问答社区
将HWND转换为IntPtr (CLI)
我的C ++ MFC代码中有一个HWND,我想将此HWND传递给C#控制,并将其作为Intptr. 我的代码中有什么问题,我该如何正确执行? (我认为使用CLI指针是错误的,因为我遇到了一个错误,即它无法从系统:: intptr^到System :: Intptr.但是我不知道如何确切地使所有这些工作正常正常工作. ..) 我的C ++ MFC代码: HWND myHandle= this->GetSafeHwnd(); m_CLIDialog->UpdateHandle(myHandle); 我的C#代码: public void UpdateHandle(IntPtr mHandle) { ...... } 我的CLI代码: void CLIDialog::UpdateHandle(HWND hWnd) { System::IntPtr^ managedhWnd = gcnew System::IntPtr(); HWND ph
0 2024-04-15
编程技术问答社区
任何依赖C++的CPU/依赖本地C dll的CLI(任何cpu用于C++/cli)。
这是我的问题. 我将C dll包裹在C#中.为此,我首先写一个C ++/CLI包装器.本机C库链接到C ++/CLI包装器. (C ++/CLI项目中的Linker属性). 这是现在的组织方式: - 本机c .lib:x86和64bit. 1个包含2个项目的解决方案: C ++/CLI包装器项目链接到本机c .lib C#项目引用C ++/CLI项目 我的问题来自我需要C#以"任何CPU"为目标的事实.但是此选项在C ++/CLI中不可用,因为它直接编译为本机代码. 我解决这个问题的想法是: - 在X86中编译C ++/CLI包装器,然后将配置和编译为64位.当它编译时,我想告诉它,根据平台要进行哪个DLL.即:如果以64位编译,则链接64位本机C dll,如果x86,则链接x86本机C. - 这样做,我应该能够在我的C#平台中具有任何CPU目标.再次,我将基于目标平台引用所需的DLL,而不是引用我的C ++/CLI包装器项目. 我的问题是: 我如
0 2024-04-14
编程技术问答社区
如何在C++/Cli项目中添加共享的C# NuGet依赖项?
上下文:带有2个组件,CS和CPP的视觉工作室解决方案. CS是C#/.NET45 DLL CPP是C ++/CLI DLL,用/clr编译的C ++ DLL. 我有一些来自nuget.org的纯c#项目的依赖项.我使用作者提供的原始软件包.将它们添加到CS项目中可以正常工作,但不适合CPP. 如何将C#软件包添加到C ++项目? 由于是C ++/CLI,我可以轻松地使用.NET对象,并且我使用例如.在C#库中的C ++库中.但是以某种方式,Nuget只允许我选择C#项目以将C#依赖关系添加到C ++/CLR方面. 解决方案 在您的C ++/CLI项目中,只需添加一个参考(菜单 - > core-->添加新的参考 - > browse-> browse-> browse ...)nlog.dll,将nuget下载到[solutionFolter]/packages/nlog ...文件夹. 这似乎对我有用. 其他解决方案 我这样做的方式是制作"
0 2024-04-14
编程技术问答社区
用本地C++、托管C++ cli和C#解决方案在混合模式下进行调试
我有一个多线程项目,并且启动项目设置为一个运行我的UI的C#项目.然后,由托管的C ++/CLI项目连接到C#的一系列基础C ++本机项目.我已经在C#启动项目"启用不受管理的调试"中启用了,当我尝试调试本机代码时,我能够达到设置的突破点.但是,它在我尝试再次运行并尝试再次达到一个突破点后悬挂.例如,如果我有一个循环,我会尝试在每次迭代中击中它的内部,在第二次迭代之后,程序悬挂,我必须强迫退出.我在Visual Studio 2010中工作.调试开始证明不太有用,是否有任何方法可以排除此问题? 解决方案 当我想调试本机代码以及C ++/CLI时,我确实以下内容: 在C#应用程序中,检查Allow unsafe code在构建选项卡中,Enable unmanaged code debugging在项目属性的调试选项卡中. 对于c ++/cli dll项目,在属性的调试选项卡中,将调试器类型设置为Mixed 其他解决方案 我们还遇到了问题,在调试复杂的混合代码应用程
0 2024-04-14
编程技术问答社区
用于包装C库的P/Invoke或C++/CLI
我们有一个中等大小(40-odd函数)C API,需要从C#项目调用.从逻辑上分解这些功能以形成几个类,这些类将包含呈现给项目其余部分的API. 是否有客观的理由是在API下方的互操作性中更喜欢P/Invoke或C ++/CLI,就稳健性,可维护性,部署而言,...? 我可能想到的问题可能是: 是: C ++/CLI将需要单独的组件; P/Invoke类可以在主组件中. (我们已经有多个集会,无论如何都会有C DLL,所以不是一个主要问题.) 两种方法之间的性能似乎没有明显不同. 我不确定的问题是: 我的感觉是如果存在互动问题,C ++/CLI将更容易调试;这是真的吗? 语言熟悉 - 足够的人知道C#和C ++,但是C ++/CLI细节的知识在这里稀少. 其他? 解决方案 在与现有C库合作的情况下,我更喜欢PinVoke. Pinvoke有时有点乏味和麻烦,是一项相当广泛的技术,它具有越来越多的工具和互联网文档.一般而言,无论您遇到什么问
0 2024-04-14
编程技术问答社区
如何在C++/Cli中消费一个可等待的东西
async/await在过去的几年中,在C#世界中获得了很多知名度.异步函数也倾向于在应用程序中迅速传播:需要等待等待,因此调用函数必须是异步的,因此也是一个需要等待的期待,等等. . 我正在使用C ++/CLI项目中的C#库.库公开异步API. Visual C ++编译器不支持async/await.因此,我无法等待图书馆给我的任何API. 我有以下选项: 调用异步函数并"让它开始":不是一个选项,因为我经常需要返回值继续进行. 呼叫Wait()或访问Task/Task对象的Result属性async函数返回:引起UI线程的臭名昭著的死锁 有什么办法可以做这项工作?如果需要的话,我不介意同步执行异步API. 解决方案 对我来说,听起来您的问题更多是一个更大问题的症状.我个人会尽力避免将业务逻辑放入C ++ -CLI模块中.具体来说,我尝试将ref class功能限制为3个主要领域: 将托管方法调用转换为本机方法调用(其中包括必要时转换参
0 2024-04-13
编程技术问答社区
将C++包裹在C#中使用
好吧,基本上有一个大型C ++项目(recast)我想包装这样我就可以在我的C#项目中使用它. 我已经尝试这样做了一段时间,这就是我到目前为止的.我正在使用C ++/CLI包装所需的类,以便可以在C#中使用它们. 但是,我在C#项目中也需要大量的结构和枚举.那么我该如何包装 我现在正在使用的基本方法是将DLLEXPORT调用添加到本机C ++代码,并将其编译到DLL/LIB,将此LIB添加到我的C ++/CLI项目中并导入C ++标头,然后将CLI项目编译到一个DLL,最终添加此DLL作为我的C#项目的引用.感谢任何帮助. 这是一些代码..我需要可管理的方法,因为C ++项目很大. //**Native unmanaged C++ code //**Recast.h enum rcTimerLabel { A, B, C }; extern "C" { class __declspec(dllexport) rcContext {
0 2024-04-13
编程技术问答社区
管理型C++在c#和C++之间形成一个桥梁
我有点生锈,实际上我的C ++真的生锈了.自大学一年级以来就没有碰过它. 已经有一段时间了. 无论如何,我正在做大多数人做的事情.调用C ++的C#代码.我在网上进行了一些研究,似乎我需要创建一些托管的C ++来形成桥梁.使用__declSpec(dllexport),然后从中创建一个DLL,然后将整个东西用作包装器. 但是我的问题是 - 我真的很难找到示例.我找到了一些基本的东西,有人想将C#版本用于string.toupper(),但这是非常基本的,只是一个小的代码片段. 有人对我可以在哪里寻找更具体的东西有任何想法吗?请注意,我不想使用com.目标是完全不触摸C#代码. 解决方案 当Lain击败我写一个例子时,我会以防万一... 将其发布 编写包装器访问您自己的库的过程与访问标准.NET库之一相同. 示例C#类代码在一个名为csharpproject的项目中: using System; namespace CsharpProject
0 2024-04-13
编程技术问答社区
在C++/CLI代码的参数传递中,^符号是否取代了C#的 "ref"?
在c#中,通过参考传递为: void MyFunction(ref Dog dog) 但是,在我到目前为止我已经看到的C ++/CLI代码示例中,没有使用ref,而是使用^符号: void MyFunction(Dog ^ dog) 参数传递时,使用^符号是ref的直接替换吗?还是我没有其他意思? 其他问题:我也看到了很多: Dog ^ myDog = gcnew Dog(); 看起来像*(指针)在C ++中使用.它是否工作类似? 谢谢! 解决方案 如果Dog是参考类型(class in C#),那么C ++/CLI等效是: void MyFunction(Dog^% dog) 如果Dog是一个值类型(struct在C#中),则C ++/CLI等效是: void MyFunction(Dog% dog) 作为A 类型的装饰,^与C ++中的*大致相关,%与C ++中的&大致相关. 作为A 单一操作员,通常仍需要在
0 2024-04-13
编程技术问答社区
任何CPU/x86/x64的C#应用程序和它的C++/CLI的依赖性
我是Windows开发人员,我正在使用Microsoft Visual Studio 2008 SP1.我的开发人员机器是64位. 我目前正在处理的软件由C#编写的.EXE管理.不幸的是,我无法仅在C#中解决整个问题.这就是为什么我还在C ++/CLI中开发了一个小型托管DLL.两个项目都在同一解决方案中. 我的c#.exe构建目标是"任何CPU".当我的C ++ DLL构建目标为" X86"时,DLL不会加载. 据我所知,当我谷歌搜索时,原因是C ++/CLI语言,与其他.NET语言不同,将其编译到本机代码,而不是托管代码. 我将C ++ DLL构建目标切换到X64,现在一切都起作用.但是,Afaik一旦我的客户将我的产品安装在32位OS上,一切都将停止工作.我必须支持Windows Vista和7,每个版本的每个版本都有32位和64位版本. 我不想回到32位.我的DLL中的250行C ++代码仅占我代码库的2%. DLL仅在几个地方使用,因此在典型的使用情况下
0 2024-04-13
编程技术问答社区
Windows Azure找不到C++/CLI项目的DLL
我有一个C ++/CLI项目,该项目围绕一个不受管理的C压缩库,该项目由称为C ++压缩功能的MVC3项目引用. 当地一切正常,但是当我将解决方案发布到Azure Cloud时,我会收到一个错误,说找不到模块/DLL: 无法加载文件或汇编'lzgencoder.dll'或其依赖项之一.找不到指定的模块. 为什么找不到DLL文件?它会到错误的地方还是完全被编译?有什么办法可以检查吗?谢谢! 解决方案 问题是Visual C ++ 2010运行时库中缺少云侧. 我所做的是将Visual C ++ 2010 Repeributable软件包添加到项目中,以及一个脚本,以在启动时默默地安装它,现在是本机DLL的工作.如果您使用的是本机C dll,则还需要此. 步骤: 1)下载Visual C ++ 2010 Redistibutable套件 ,并将其添加到您的项目中. 2)创建一个新的批处理文件并将其添加到其中: vcredist_x64.ex
0 2024-04-13
编程技术问答社区
SQL Server。"CREATE ASSEMBLY for assembly 'Test' failed because assembly 'Test' is malformed or not a pure .NET assembly."
尝试将混合模式C ++/CLI汇编加载到SQL Server 2012: 时会遇到此错误 CREATE ASSEMBLY [Test] AUTHORIZATION [dbo] from 'H:\test.dll' WITH PERMISSION_SET = SAFE msg 6544,16级,状态1,第1行创建组装组件 "测试"失败,因为汇编'test.dll'是畸形或不是纯的.NET 集会.无法验证的PE标头/本机存根. 解决方案 混合模式组件在SQLCLR组件中不允许;仅允许纯MSIL组件.这在 组装验证 SQL Server执行由Create Assembly语句上传的汇编二进制文件进行检查,以保证以下内容: 二进制组装二进制组装很好地形成了有效的元数据和代码段,并且代码段具有有效的Microsoft中间语言(MSIL)指令. 有关更多详细信息,请参见以下答案(也在堆栈溢出上): sql Server自定义CLR失败带有错误"无法加载文件或汇编
0 2024-04-12
编程技术问答社区
不能跨AppDomains传递GCHandle:没有委托的解决方案?
我在C ++中有基本库,客户端应用程序在C#中.有C ++/CLI接口可以从C#访问C ++ API.每件事都可以正常工作,直到一个以上的应用域才发挥作用,例如Nunit或WCF托管,即使用一个应用程序域. 我已将托管对象存储在CLI中的 gcroot 中以进行回调.我读到这是应用域问题的根本原因("不能跨应用程序传递gchandle"),因为它们没有应用域信息( http://lambert.geek.nz/2007/05/05/29/unmanaged-appdomain-callback/). someone suggested to use delegates but my underlying c++ layer is expecting object not function pointer( http://www.lenholgate.com/blog/2009/07/error-cannot-pass-pass-a-gchandle-across-appdomain
0 2024-04-12
编程技术问答社区
如何将C#和C++程序集链接成一个可执行文件?
我有VS2008解决方案,CONTA一个生成C#可执行文件的项目,该项目引用了一个同时包含C ++/CLI和UNAMARED C ++的DLL的项目. 我想将它们合并到一个可执行文件中,因为C ++ DLL包含我要嵌入主要可执行文件的安全代码. 我无法使用ilmerge,因为DLL包含托管和未管理的代码.建议的解决方案似乎是使用link.exe将C#汇编与C ++对象文件链接.这就是我要做的. 我手动编辑了C#可执行文件的项目文件以生成NetModule.我在可执行的项目中添加了一个帖子构建步骤,以运行link.exe以将C#NetModule和编译的C ++对象文件链接在一起,然后运行mt.exe以合并两个项目创建的汇编表现.这是成功运行的,但是EXE仍然包含对C ++项目的普通构建过程生成的DLL中定义的C ++类型. . 然后, i在C ++ DLL的项目设置中指定/noAssembly,因此它也会生成NetModule.在C#项目中,我删除了对C ++项目
0 2024-04-12
编程技术问答社区
从托管的C++/CLI中使用C#扩展方法
如果我的术语有些不对,请原谅我.我对托管C ++/CLI的了解非常有限. 我有一个MFC应用程序,该应用程序使用启用/CLR选项的DLL.该DLL使用几个C#DLL使用WCF与服务器进行通信.在大多数情况下,这很好. 在一个C#DLL中,我在System.net.ipaddress类中添加了一个扩展方法,该类将检索iPaddress对象的子网掩码(使用UnicastipadDressInfressInformation类和其IPV4mask).扩展方法在C#方面效果很好,但是我不知道如何在托管的C ++/CLI代码中使用它. 首先,这甚至可能吗?如果是这样,托管C ++/CLI侧的语法是什么样的?我必须使用/clr:纯选项才能工作吗? 这是扩展方法的示例: using System.Net; using System.Net.NetworkInformation; public static class IPAddressExtensions { p
0 2024-04-12
编程技术问答社区
从C++调用C#,反向P/Invoke,混合模式DLL和C++/CLI
据我了解,我可以使用反向p/indoke从C ++调用C#.反向P/Invoke只是以下情况: 创建您管理的(C#)类. 创建C ++/CLI(以前管理的C ++)类库项目.用它来调用托管C#类(大概是通过参考). 来自本机C ++的C ++/CLI代码. 问题: 这是正确的吗? 在步骤2上创建的DLL是被称为混合模式DLL的? 就MS而言,C ++/CLI是否完全取代了托管的C ++? 是否完全避免使用这种方法? 在什么时候创建和运行CLR,以及谁? 预先感谢 解决方案 这是我所知最好的答案: 是 是的,这是一个混合模式dll(实际上,您可以管理本机C ++项目的一个文件,并在该文件中创建此C ++/CLI类,并直接从该文件调用代码.您甚至都不需要一个单独的DLL来实现这一目标. C ++/CLI和托管C ++都代表同一件事.唯一的区别是,直到Visual Studio 2003的较旧版本,它被称为托管C ++.后来,语法发生了很大
2 2024-04-12
编程技术问答社区
今天,我怎样才能在C#中接近非空的引用类型?
我已经阅读了许多 nonnon-nullable "> notable 问答.看来C#(4.0)中接近不可用类型的最佳方法是Jon Skeet的 nornable hack. 但是,C ++/CLI似乎通过支持托管参考来解决了很多问题:Foo%(而不是本机C ++ Foo&).编译器通过将modreq(IsImplicitlyDereferenced)添加到参数中来制作此工作.尝试从C#调用此功能结果: '' is not supported by the language 有更好的东西, nullable ? 有什么方法可以(合理地 - i.e.,使用反射)调用c ++/cli方法Foo::Method(Bar%) c#? [edit] 目前似乎没有什么比 nullable ... 已经至少有部分解决方案. 解决方案 我已经遇到了几次……我还没有找到比Skeet的解决方案更好的东西.它解决了我遇到的所有案件,所以我必须投
0 2024-04-12
编程技术问答社区
从C#、C++/CLI和C++中共享一个枚举
我有一个由三个部分组成的库.首先是本机C ++,它提供了实际功能.第二是C ++库的C ++/CLI包装器/适配器,以简化C#到C ++过渡.最后,我有一个C#库,它通过C ++/CLI适配器调用C ++库. 现在,我有两组并行枚举定义,一个定义存储在.cs文件中,另一组存储在.h文件中.这提出了双重问题: 我有双重维护.我必须始终同步两个文件位置的枚举的更改. 两个枚举使用的名称空间应该相同,但是C ++/CLI包装器,它可以查看两套枚举并在它们之间翻译,会造成命名碰撞. 现在,我不确定 this 或 将解决两个问题.想法? 解决方案 只需将您的#include "Enum.cs"指令放入外部名称空间即可解决命名碰撞. 编辑:布伦特建议的一种变体是使用#define替换.cs文件中声明的名称空间之一(甚至是枚举名称本身).这也避免了命名碰撞,而不会使命名空间层次结构更深. 其他解决方案 即使您在本机C ++中包括C#枚举(如第一个链接),两个枚
2 2024-04-12
编程技术问答社区
管理的C++/CLI方法中的可选参数
在C#? 中使用时,我如何在C ++/CLI中声明具有可选参数的托管方法 我已经用可选和a 请参阅:如何编码默认参数值),但是只有可选属性才能尊重. c ++/cli: public ref class MyClass1 { public: MyClass1([System::Runtime::InteropServices::Optional] [System::Runtime::InteropServices::DefaultParameterValue(2)] int myParam1) ↑ { System::Console::WriteLine(myParam1); } }; c#: var myInstance1 = new MyClass1(); // compiles and runs 输出
0 2024-04-12
编程技术问答社区