标签: c++-cli

C++/CLI相当于C#的'readonly'关键字

什么是C#的readonly关键字的C++/CLI等价物?

具体来说,如何编写C++/CLI类的公共成员或受保护成员,以便readonly在从C#引用它时?

c++-cli

20
推荐指数
1
解决办法
5513
查看次数

如何在WindowsC++/CLI中获取应用程序可执行文件名?

我需要根据可执行文件名更改应用程序的功能.没什么大不了的,只是更改显示的字符串和一些内部标识符.该应用程序是由本机和.Net C++ - CLI代码混合编写的.

我看过的两种方法是在Win32中解析GetCommandLine()函数,并在.Net中填充AppDomain和其他东西.但是,使用GetCommandLine并不总是有效,因为从调试器运行时命令行为空.而.Net AppDomain的东西似乎需要大量的东西.

那么在C++/CLI中确定可执行文件名称的最好/最简单/最有效的方法是什么?(我有点希望我错过了.Net中可用的简单内容.)

编辑:我应该提到的一件事是,这是一个使用C++/CLI的Windows GUI应用程序,因此无法访问传统的C风格主函数,它使用Windows WinMain()函数.

.net winapi c++-cli

19
推荐指数
3
解决办法
3万
查看次数

如何在托管代码中使用c ++ cli中的foreach

您好如何使用vs2003在托管代码c ++中使用foreach循环.

c++-cli

19
推荐指数
3
解决办法
3万
查看次数

人们如何处理警告C4793:'some_function':编译为本机的函数?

我正在使用OpenCV库,并且"warning C4793: 'anonymous namespace'::CV_XADD' : function compiled as native"如果我的C++项目是使用CLR支持编译的,则会生成其中一个头文件cxoperations.hpp .我可以通过包围这样的OpenCV标头来阻止警告:

#pragma managed(push,off)
#include <cv.h>
#pragma managed(pop)
Run Code Online (Sandbox Code Playgroud)

但实际使用OpenCV的项目不是使用CLR支持编译的,它是一个本机C++静态库.具有CLR支持并且在没有pragma语句的情况下生成此警告的项目只使用此静态库.所以我有点惊讶的是,根本没有创建警告,特别是考虑到整个静态库没有使用CLR支持进行编译,但只有这一个标题会导致问题.

因此,这个解决方案对我来说似乎不太理想.这是你如何处理这个警告,还是你可以推荐一个更好的做法?

warnings opencv c++-cli pragma visual-studio

19
推荐指数
1
解决办法
1万
查看次数

在使用C++/CLI代码传递参数时,^符号是否替换了C#的"ref"?

在C#中,通过引用传递:

void MyFunction(ref Dog dog)
Run Code Online (Sandbox Code Playgroud)

但是到目前为止我看到的C++/CLI代码示例中没有使用ref但是使用了^符号:

void MyFunction(Dog ^ dog)
Run Code Online (Sandbox Code Playgroud)

参数传递时是否使用^符号直接替换ref?还是有其他一些我不知道的含义?

附加问题:我也看到了很多:

Dog ^ myDog = gcnew Dog();
Run Code Online (Sandbox Code Playgroud)

看起来它*在C++中像(指针)一样使用.它的工作原理是否类似?

谢谢!

c# c++-cli

19
推荐指数
1
解决办法
2万
查看次数

C++/CLI对象^%(插入符号百分号)声明是什么意思?

这显然是一个谷歌证明的术语,因为我不能让任何搜索引擎不丢弃"额外"字符.我也在C++参考中查看了MSDN,但我似乎无法找到C++/CLI参考,因为声明部分中没有任何内容.

c++-cli

18
推荐指数
3
解决办法
8700
查看次数

C++/CLI委托作为函数指针(System.AccessViolationException)

我一直在试验C++/CLI委托(因为我正在尝试创建一个.NET参考库),我遇到了以下问题.

我在C++/CLI中定义委托,然后在C#中创建委托的实例,然后通过非托管C++通过函数指针调用委托的实例.这一切都按预期工作.

代码来说明这一点(首先是我的C#)

using System;

namespace TestProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            Library.Test.MessageDelegate messageDelegate = new Library.Test.MessageDelegate(Message);
            Library.Test test = new Library.Test(messageDelegate);
            test.WriteMessage();
            Console.Read();
        }

        static void Message()
        {
            Console.WriteLine(1024);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来我的托管c ++文件(Managed.cpp)

#include "Unmanaged.hpp"
#include <string>

namespace Library
{
    using namespace System;
    using namespace System::Runtime::InteropServices;

    public ref class Test
    {
    public:
        delegate void MessageDelegate();
    internal:
        MessageDelegate^ Message;
        void* delegatePointer;

    public:
        Test(MessageDelegate^ messageDelegate)
        {
            delegatePointer = (void*)Marshal::GetFunctionPointerForDelegate(messageDelegate).ToPointer();
        }

        void WriteMessage()
        {
            Unmanaged::WriteMessage(delegatePointer);
        }
    }; …
Run Code Online (Sandbox Code Playgroud)

.net interop c++-cli c#-4.0

18
推荐指数
1
解决办法
9379
查看次数

如何将共享C#NuGet依赖项添加到C++/Cli项目?

上下文:具有2个程序集,Cs和Cpp的Visual Studio解决方案.

  • 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.

.net c# c++-cli nuget visual-studio-2012

18
推荐指数
1
解决办法
4576
查看次数

当C++/CLI项目使用/ ZI引用静态lib项目时警告LNK4075(编辑并继续)

我在Visual Studio 2012解决方案中有以下项目:

  • Native(no /clr)静态lib项目,使用/ZIEdit And Continue 编译.
  • C++/CLI DLL项目,它引用了上面的静态库.

C++/CLI项目使用以下警告构建:

warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:LBR' specification
Run Code Online (Sandbox Code Playgroud)

如果将/ OPT:NOLBR添加到C++/CLI项目的链接器选项中,则警告变为:

warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
Run Code Online (Sandbox Code Playgroud)

任何更改C++/CLI项目的增量链接设置的尝试都不会更改警告(C++/CLI项目永远不会以递增方式链接).

我知道我将无法在C++/CLI项目中使用"编辑并继续",因为这不受支持.实际上,在静态lib项目中将/ ZI更改为/ Zi(禁用编辑并继续)会消除警告,但我不能这样做 - 该lib的其他非CLR使用者需要使用"编辑并继续".

如何在不禁用静态库中的编辑和继续的情况下摆脱此警告(并且希望不为静态库的本机和CLR用户维护单独的构建配置)?我的意思是,有没有办法要求链接器忽略/EDITANDCONTINUE嵌入在引用的静态库中的指令(与/NODEFAULTLIB忽略/DEFAULTLIB指令的方式相同)?

我创建了一个最小的VS解决方案,可以重现所描述的问题.

warnings c++-cli edit-and-continue visual-studio-2012

18
推荐指数
1
解决办法
7077
查看次数

在Win 8.1下c ++/cli DLL失败

我写了一个Win32/net DLL,它在Win XP,Win7和8下工作正常,但在Win 8.1下它失败了.

Dependency Walker说:找不到API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL(user32.dll会调用它们)

谷歌意味着,MS改变了8.1中的一些系统DLL(并忽略了兼容性),因此许多程序都有同样的问题.

"找不到文件"的完整列表:

API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL
MSVCR120.DLL
API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL
API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL
EXT-MS-WIN-NTUSER-UICONTEXT-EXT-L1-1-0.DLL
IESHIMS.DLL
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决这个问题吗?

windows dll winapi mixed-mode c++-cli

18
推荐指数
1
解决办法
2万
查看次数