我们有一个使用Managed C++语法编写的旧项目.我想向团队提出一个相当无痛的建议(我不介意某种程度的人机交互,我认为我的预期是现实的,我们仍然需要手工完成一些工作)更新方法现有的C++/CLI语法代码,以便我们也可以添加XML文档(该项目是一个库到其他项目中,并且文档非常有用).
那么,有什么好的工具来帮助解决这个问题吗?或者只是切换到新的C++/CLI语法编译器并修复错误的情况?
我们正在考虑使用托管C++为一些遗留C++库编写.Net可调用包装器.
这一切看起来都很简单.有什么我们需要注意的吗?
我正在用这样的行更新一些旧的Managed C++代码:
instanceOfEventSource->add_OnMyEvent(
new EventSource::MyEventHandlerDelegate(this, MyEventHandlerMethod) );
Run Code Online (Sandbox Code Playgroud)
哪里
C++/CLI中的正确语法是什么?
我有一个引用托管C++项目的C#GUI应用程序,它需要7个本机C++ DLL.我正在寻找将这7个DLL复制到最终项目输出的最干净的方法.
什么工作
将所有DLL添加到C#应用程序,指定:
构建操作=="内容"
复制到输出目录==始终复制"
在某些情况下,这将使项目的基本文件夹成为混乱的DLL,所有这些都是引用项目的要求,而不是项目本身.
什么行不通
在这种情况下,最佳解决方案是什么?我希望托管C++项目能够在可能的情况下处理它自己的DLL要求,并且最好以不会阻止项目跨多个应用程序使用的方式.
如果有一个干净的项目,最好是在项目的子文件夹中插入我的所有代码文件,并在根目录下使用DLL来使第一个解决方案有效吗?
解决方案:
使用Joseph的post-build建议,以下命令可以使用"Required DLLs"文件夹.
xcopy"$(ProjectDir)必需的DLL*.*""$(TargetDir)"/ Q/Y.
/ Q隐藏输出中的单个文件,/ Y禁止覆盖提示.
我的整个应用程序(相当大,具有20MB可执行文件)是用非托管C++编写的.因为我可以清楚地看到使用托管代码的优势,我想开始在我的应用程序中引入托管代码,但是我从哪里开始呢?
我可以轻松地开始使用C++/CLI并将其与我的应用程序的其余部分链接吗?(尽管C++/CLI语法似乎相当"异国情调").
或者转到C#更好,但是将这与我的非托管C++代码"链接"在一起的最佳方法是什么?
使用/ clr选项编译所有C++代码是否有意义?这会有用吗?
我不得不担心编组吗?这是否会产生开销,或者我可以在托管和非托管之间切换而不会造成性能损失(正如我20年前混合fortran和C时所做的那样).性能在我的应用程序中非常重要,因为它是一个科学的应用程序,有时会处理几千兆字节的内存.
或者只重新设计用户界面,并且只在C#中编写它,并将我的应用程序的其余部分(计算逻辑,业务逻辑,数据库接口......)保存在非托管C++中?
由于我的应用程序有时需要处理几千兆字节的内存,因此我有一个64位的版本.拥有64位托管代码是否容易?如果使用那么多内存,Woudl垃圾收集器仍然有效吗?
简单说明:我从哪里开始?
帕特里克
我需要开发一些应该可以从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)"
我还需要做什么来让项目运行?
提前致谢.
我在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++中如何做到这一点的资源,所以如果有人有任何经验或链接,我真的很感激任何帮助.
对于有多少人真正使用C++/CLI感到好奇?那么有多少人在使用它?是否存在人们仅在托管环境下寻找程序员的特定工作?围绕c ++/cli的社区有多大?从我到目前为止看到的有很多语法变化,这是我应该学习的东西,作为一个c ++程序员?另外,是c ++/cli,c ++.net?我对任何微软都很无知.
我想使用 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)
我在网上搜索过,但还没有解决。
谢谢,
大统华集团
我正在导出一个可以从非托管代码调用的方法,但该函数本身存在于托管 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) managed-c++ ×10
c++-cli ×5
.net ×3
c++ ×3
c# ×1
com ×1
dll ×1
dllexport ×1
extern ×1
interop ×1
linkage ×1
managed-code ×1
mixed-mode ×1
msbuild ×1
properties ×1
unmanaged ×1
vc90 ×1
visual-c++ ×1