什么是C#的readonly关键字的C++/CLI等价物?
具体来说,如何编写C++/CLI类的公共成员或受保护成员,以便readonly在从C#引用它时?
我需要根据可执行文件名更改应用程序的功能.没什么大不了的,只是更改显示的字符串和一些内部标识符.该应用程序是由本机和.Net C++ - CLI代码混合编写的.
我看过的两种方法是在Win32中解析GetCommandLine()函数,并在.Net中填充AppDomain和其他东西.但是,使用GetCommandLine并不总是有效,因为从调试器运行时命令行为空.而.Net AppDomain的东西似乎需要大量的东西.
那么在C++/CLI中确定可执行文件名称的最好/最简单/最有效的方法是什么?(我有点希望我错过了.Net中可用的简单内容.)
编辑:我应该提到的一件事是,这是一个使用C++/CLI的Windows GUI应用程序,因此无法访问传统的C风格主函数,它使用Windows WinMain()函数.
我正在使用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支持进行编译,但只有这一个标题会导致问题.
因此,这个解决方案对我来说似乎不太理想.这是你如何处理这个警告,还是你可以推荐一个更好的做法?
在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++参考中查看了MSDN,但我似乎无法找到C++/CLI参考,因为声明部分中没有任何内容.
我一直在试验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) 上下文:具有2个程序集,Cs和Cpp的Visual Studio解决方案.
我有一些来自nuget.org的纯C#项目的依赖项.我使用作者提供的原始包.将它们添加到Cs项目工作正常,但不是Cpp.
如何将C#包添加到C++项目中?
因为它是C++/Cli,所以我可以很容易地使用.net对象,并且我在C#库中使用例如来自C#库的东西.但不知何故nuget只允许我选择C#项目来添加C#依赖,而不是C++/clr.
我在Visual Studio 2012解决方案中有以下项目:
/clr)静态lib项目,使用/ZIEdit And Continue 编译.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解决方案,可以重现所描述的问题.
我写了一个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)
有人知道如何解决这个问题吗?