标签: managed-c++

有没有用于将托管C++转换为C++/CLI的工具?

我们有一个使用Managed C++语法编写的旧项目.我想向团队提出一个相当无痛的建议(我不介意某种程度的人机交互,我认为我的预期是现实的,我们仍然需要手工完成一些工作)更新方法现有的C++/CLI语法代码,以便我们也可以添加XML文档(该项目是一个库到其他项目中,并且文档非常有用).

那么,有什么好的工具来帮助解决这个问题吗?或者只是切换到新的C++/CLI语法编译器并修复错误的情况?

managed-c++ c++-cli code-conversion

6
推荐指数
1
解决办法
3415
查看次数

用于旧C++库的托管C++包装器

我们正在考虑使用托管C++为一些遗留C++库编写.Net可调用包装器.

这一切看起来都很简单.有什么我们需要注意的吗?

.net c++ managed-c++

6
推荐指数
2
解决办法
5425
查看次数

订阅事件的C++/CLI语法是什么?

我正在用这样的行更新一些旧的Managed C++代码:

instanceOfEventSource->add_OnMyEvent( 
    new EventSource::MyEventHandlerDelegate(this, MyEventHandlerMethod) );
Run Code Online (Sandbox Code Playgroud)

哪里

  • EventSource是发布事件的类
  • instanceOfEventSource是该类的一个实例
  • EventSource :: MyEventHandlerDelegate是事件的委托类型
  • MyEventHandlerMethod是当前类(其中"this"是一个实例)中的(非静态)方法,其签名与EventSource :: MyEventHandlerDelegate匹配

C++/CLI中的正确语法是什么?

managed-c++ c++-cli

6
推荐指数
1
解决办法
3541
查看次数

在.NET项目中复制本机DLL的最简洁方法

我有一个引用托管C++项目的C#GUI应用程序,它需要7个本机C++ DLL.我正在寻找将这7个DLL复制到最终项目输出的最干净的方法.

什么工作
将所有DLL添加到C#应用程序,指定:

构建操作=="内容"
复制到输出目录==始终复制"

在某些情况下,这将使项目的基本文件夹成为混乱的DLL,所有这些都是引用项目的要求,而不是项目本身.

什么行不通

  • 使用上述设置将这些DLL添加到名为"Required DLLs"的文件夹中.它将其复制到输出中具有相同名称的文件夹,导致它们位于不正确的位置.我看不到指定输出目录的方法.
  • 嵌入式资源:在C#P/Invoke中,您可以将您引用的DLL添加为嵌入式资源,并将DLL嵌入到最终库中.我在Managed C++中没有看到这种可能性,我甚至不确定它是否适用于引用链.
  • 将DLL作为内容添加到托管C++项目中.文件不会被复制到输出目录.

在这种情况下,最佳解决方案是什么?我希望托管C++项目能够在可能的情况下处理它自己的DLL要求,并且最好以不会阻止项目跨多个应用程序使用的方式.

如果有一个干净的项目,最好是在项目的子文件夹中插入我的所有代码文件,并在根目录下使用DLL来使第一个解决方案有效吗?

解决方案:
使用Joseph的post-build建议,以下命令可以使用"Required DLLs"文件夹.

xcopy"$(ProjectDir)必需的DLL*.*""$(TargetDir)"/ Q/Y.

/ Q隐藏输出中的单个文件,/ Y禁止覆盖提示.

c# msbuild dll managed-c++

6
推荐指数
1
解决办法
2686
查看次数

我的应用程序是不受管理的.我从哪里开始介绍托管代码?

我的整个应用程序(相当大,具有20MB可执行文件)是用非托管C++编写的.因为我可以清楚地看到使用托管代码的优势,我想开始在我的应用程序中引入托管代码,但是我从哪里开始呢?

我可以轻松地开始使用C++/CLI并将其与我的应用程序的其余部分链接吗?(尽管C++/CLI语法似乎相当"异国情调").

或者转到C#更好,但是将这与我的非托管C++代码"链接"在一起的最佳方法是什么?

使用/ clr选项编译所有C++代码是否有意义?这会有用吗?

我不得不担心编组吗?这是否会产生开销,或者我可以在托管和非托管之间切换而不会造成性能损失(正如我20年前混合fortran和C时所做的那样).性能在我的应用程序中非常重要,因为它是一个科学的应用程序,有时会处理几千兆字节的内存.

或者只重新设计用户界面,并且只在C#中编写它,并将我的应用程序的其余部分(计算逻辑,业务逻辑,数据库接口......)保存在非托管C++中?

由于我的应用程序有时需要处理几千兆字节的内存,因此我有一个64位的版本.拥有64位托管代码是否容易?如果使用那么多内存,Woudl垃圾收集器仍然有效吗?

简单说明:我从哪里开始?

帕特里克

.net mixed-mode managed-c++ unmanaged managed-code

6
推荐指数
1
解决办法
375
查看次数

从托管c ++生成COM可见程序集(C++/CLI)

我需要开发一些应该可以从VB6使用托管C++(C++/CLI)调用的类.

我首先在C#中开发了一个示例,我只需使用"注册COM互操作"和"使汇编COM可见"(并使用属性[ClassInterface(ClassInterfaceType.AutoDual)]来通过COM进行汇编而没有问题在VB6上提供方法.

之后,我尝试将示例转换为C++/CLI,但没有成功.我使用[ClassInterface(ClassInterfaceType.AutoDual)]属性创建了相同的类.我已设置"嵌入式IDL"设置以指定输出TLB,但不会自动生成TLB.如果我在生成的DLL上使用tlbexp util,我得到一个可以在VB6导入的tlb但是当我尝试创建一个实例时,我得到一个"ActiveX compoennt无法创建对象(429)"

我还需要做什么来让项目运行?

提前致谢.

com interop managed-c++ c++-cli

6
推荐指数
1
解决办法
2048
查看次数

如何在托管c ++中将属性名称作为字符串获取

我在C#中看到很多用于执行此操作的条目,但对C++没有任何用处

我在一些托管C++代码中有一组属性,用于在C#部分和c ++部分之间传递数据.在C#方面,这里给出的答案非常有效,我想用C++做类似的事情.链接中包含的解决方案的副本:

string NameOf<T>(Expression<Func<T>> expr) {
    return ((MemberExpression) expr.Body).Member.Name;
}

var gmtList = new SelectList(repository.GetSystemTimeZones(),
    NameOf(() => tz.Id),
    NameOf(() => tz.DisplayName));
Run Code Online (Sandbox Code Playgroud)

我的问题是,我似乎无法获得正确的调用语法,具体来说,这部分:

() => tz.DisplayName
Run Code Online (Sandbox Code Playgroud)

我似乎无法在网上找到我在C++中如何做到这一点的资源,所以如果有人有任何经验或链接,我真的很感激任何帮助.

managed-c++ c++-cli properties visual-c++

6
推荐指数
1
解决办法
2585
查看次数

C++/CLI社区

对于有多少人真正使用C++/CLI感到好奇?那么有多少人在使用它?是否存在人们仅在托管环境下寻找程序员的特定工作?围绕c ++/cli的社区有多大?从我到目前为止看到的有很多语法变化,这是我应该学习的东西,作为一个c ++程序员?另外,是c ++/cli,c ++.net?我对任何微软都很无知.

managed-c++ c++-cli

5
推荐指数
2
解决办法
533
查看次数

使用dllexport时出错?

我想使用 dllexport 导出函数。但是我在编译器“错误 C4439:'WrappedC':签名中具有托管类型的函数定义必须具有 __clrcall 调用约定”时遇到了错误。

我在头文件(.h)中的代码是:

extern "C" 
{

__declspec(dllexport) int __stdcall ABC(int i);
__declspec(dllexport) char* __stdcall C(int i);
__declspec(dllexport) array<char>^ __stdcall WrappedC(int i) ;

}
Run Code Online (Sandbox Code Playgroud)

我尝试将 _stdcall 更改为 __clrcall 但又出现另一个错误:

error C3395: 'WrappedC' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention
Run Code Online (Sandbox Code Playgroud)

我在网上搜索过,但还没有解决。

谢谢,

大统华集团

.net c++ managed-c++ dllexport

5
推荐指数
1
解决办法
5731
查看次数

C 链接函数无法返回 C++ 类 - 由我的方法的内容导致的错误

我正在导出一个可以从非托管代码调用的方法,但该函数本身存在于托管 C++ 项目中。以下代码导致编译器错误:

error C2526: 'System::Collections::Generic::IEnumerator<T>::Current::get' : C linkage function cannot return C++ class 'System::Collections::Generic::KeyValuePair<TKey,TValue>'
error C2526: 'System::Collections::Generic::Dictionary<TKey,TValue>::KeyCollection::GetEnumerator' : C linkage function cannot return C++ class 'System::Collections::Generic::Dictionary<TKey,TValue>::KeyCollection::Enumerator'
Run Code Online (Sandbox Code Playgroud)

extern "C"
__declspec( dllexport )
bool MyMethod(std::string &name, std::string &path, std::map<std::string, std::string> &mymap)
{
  System::Collections::Generic::Dictionary<System::String ^, System::String^> _mgdMap = gcnew System::Collections::Generic::Dictionary<System::String ^, System::String ^>();

  // Blah blah processing
}
Run Code Online (Sandbox Code Playgroud)

稍微研究一下这个错误,这个问题通常与标记为“extern“C”的方法的定义有关。那么为什么它会关心方法内部发生的事情呢?

如果我注释掉 Dictionary 初始化,或者将它切换到 HashTable,一切都会很好地编译。

下面的方法也适用 - 如果不是在本地定义字典,我通过在方法中初始化它来避免局部变量。

bool status = CallAnotherMethod(ConvertToDictionary(mymap));
Run Code Online (Sandbox Code Playgroud)

其中 ConvertToDictionary 被声明为

System::Collections::Generic::Dictionary<System::String ^, System::String ^>^ ConvertToDictionary(std::map<std::string, std::string> &map)
{
} …
Run Code Online (Sandbox Code Playgroud)

c++ managed-c++ extern linkage vc90

5
推荐指数
1
解决办法
4845
查看次数