Tag: C#的

SecurityException:必须将ECall方法打包到系统模块中

我有一个(C#)函数类似于以下内容。 private static bool SpecialCase = false; public void Foo() { if (SpecialCase) { InternalMethod(); return; } Console.WriteLine(); } [MethodImpl(MethodImplOptions.InternalCall)] private static extern void InternalMethod(); 当我在debugging器中使用.NET Framework 4执行此操作时,该方法成功地将空白行打印到控制台并返回。 当我在debugging器外部执行它时,它会抛出一个exception,并显示以下消息: System.Security.SecurityException: ECall methods must be packaged into a system module. 当JIT编译器编译方法而不是调用(if) InternalMethod时,会出现exception。 有什么我能做的(例如属性)告诉CLI要么不抛出SecurityException ,要么延迟exception,直到实际调用方法? 使用案例的附注:使用Microsoft .NET Framework运行时, SpecialCase字段实际上是错误的,而在CLI的另一个(特定)实现下运行时,则为true。 在Microsoft .NET Framework下运行时,对InternalMethod的调用实际上是无法访问的。

为什么标准中不允许初始化模板参数列表中的常量相关types?

在对这篇文章的回答“ (部分地)专门化非依赖types的非types模板参数 ”中,它指出: 对应于专门的非types参数的模板参数的types不应该依赖于专门化的参数。 [例如: template <class T, T t> struct C {}; template <class T> struct C<T, 1>; // error template< int X, int (*array_ptr)[X] > class A {}; int array[5]; template< int X > class A<X,&array> { }; // error – 例子] 我的问题是为什么这个限制在这里? 至less有一个用例,我发现这个限制干扰了编写干净的代码。 例如 template <typename T, T*> struct test; template <typename […]

为什么这个从属名称查找find一个全局标识符而不是方法?

当编译器试图parsingi.template hi<T>(); 它发现hi在全球命名空间,而不是在i ( ideone )的方法hi 。 为什么? #include <cstdio> // Define 'hi' and 'bye' in the global namespace; these should *not* be used template<typename T> struct hi { }; template<typename T> struct bye { }; // Foo needs to be templated for Foo::Inner to be a dependent type (I think) template<typename T> struct Foo […]

通过元编程缓解C ++到Objective-C /cocoa桥接?

在一个纯粹的C ++世界中,我们可以在编译时间使用基于模板的编译时和运行时技术(例如,大部分自动将marshall传入或传出使用传统types的调用)的组合,在不同的组件或接口之间生成接口或粘合代码。 当需要将Objective-C / Cocoa与GUI,系统集成或IPC接口的C ++应用程序进行交互时,由于input较不严格,事情变得更加困难 – 但是通常不会再需要一个扁平的重复接口层:瘦桥接代表必须定义或转换代码语言桥接调用必须写。 如果您必须处理非平凡大小的接口,并且希望避免基于脚本的代码生成,那么这很快就会变得繁琐,而且每次重构都必须发生,这只是一个痛苦。 使用(模板)元编程和Objective-C运行时库的组合,应该可以大大减less代码量… 在我重新发明轮子(可能浪费时间)之前 ,有没有人知道在这个方向上的技术,最佳实践或例子? 举一个例子,假设我们需要一个支持这个非正式协议的委托: – (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2; – (NSNumber*) indexOf:(CustomClass*)obj; 而不是实现一个明确桥接到C ++实例的Obj-C类,我想这样做,而不是: class CppObj { ObjcDelegate m_del; public: CppObj() : m_del(this) { m_del.addHandler <NSString* (NSString*, NSString*)> ("concatString", &CppObj::concat); m_del.addHandler <NSNumber* (CustomClass*)> ("indexOf", &CppObj::indexOf); } std::string concat(const std::string& s1, const std::string& s2) { return s1.append(s2); } size_t […]

将开发人员文档添加到Visual Studio项目的最佳方法

基本上,问题是: 我应该在哪里(以哪种格式)存储与我的Visual Studio项目相关的文本开发人员文档? 详细说明:XML注释非常棒,但不包含所有用例。 有时候,您想要高级地描述项目的类架构,向库中添加使用注意事项,或者将其他types的消息留给下一代在此项目中工作的开发人员。 我想直接将这些文档作为文件添加到Visual Studio项目中,以确保(a)开发人员无需进一步search即可使用这些文档,并且(b)版本控制(使用相同的svn / git / whatever repository作为源代码)。 目前,我添加一个文件夹_Documentation到项目和使用文本文件,但我不知道这是否是最好的解决scheme。 Visual Studio没有自动换行文本1的选项,并且在每个更改都令人讨厌之后手动修复换行符。 另一方面,Word文档在版本控制方面效果不佳,而TeX在每个开发人员的电脑上安装和教授都是一件麻烦事。 有没有一个完善的最佳实践呢? 1我知道有Edit / Advanced / Word-Wrap,但这只影响显示,而不影响文件本身。

TypeConverter与转换与TargetType.Parse

据我所知,在.NET中至less有三种转换数据types的方法: 使用System.ComponentModel.TypeConverter var conv = System.ComponentModel.TypeDescriptor.GetConverter(typeof(int)); var i1 = (int)conv.ConvertFrom("123"); 使用System.Convert.ChangeType() : var i2 = (int) Convert.ChangeType("123", typeof (int)); 使用目标types的Parse / TryParse方法: var i3 = int.Parse("123"); // or TryParse 有什么指导方针或经验法则何时使用哪种方法在.NET基本数据types(特别是从string到其他数据types)之间进行转换?

如何在Medium Trust中写入Web.Config?

上传我的第一个体面大小的networking应用程序到我的共享主机为我提供了一个新的挑战,我的意思是,不眠之夜。 问题是,我当然没有开发我的中等信任申请(或者有什么线索)。 我减轻了所有的问题,除了一个。 我已经写了一个pipe理员的安装程序能够指定他们的连接string和其他首选项,但我找不到一个方法来写入中等信任的web.config。 有没有人有一个解决scheme,或者我应该只是在其他文件的偏好?

C ++模板和内联

当我正在编写一个简单的(非模板)类时,如果函数实现是“适当的”,它会被自动视为inline 。 class A { void InlinedFunction() { int a = 0; } // ^^^^ the same as 'inline void InlinedFunction' } 谈论基于模板的类时,这条规则是什么? template <typename T> class B { void DontKnowFunction() { T a = 0; } // Will this function be treated as inline when the compiler // instantiates the template? }; 另外, inline规则如何应用于非嵌套模板函数,如 […]

为什么按价值参数排除在NRVO之外?

想像: S f(S a) { return a; } 为什么不允许别名和返回值插槽? S s = f(t); S s = t; // can't generally transform it to this 🙁 如果S的拷贝构造函数有副作用,spec不允许这个转换。 相反,它需要至less两个副本(一个从t到a ,一个从a到返回值,另一个从返回值到s ,只有最后一个可以被忽略。代表t到f的拷贝的事实,唯一的拷贝在移动/拷贝构造函数的副作用的存在下仍然是强制性的)。 这是为什么?

为什么gcc和clang都会为这个程序产生不同的输出? (转换运算符vs构造函数)

程序: #include <stdio.h> struct bar_t { int value; template<typename T> bar_t (const T& t) : value { t } {} // edit: You can uncomment these if your compiler supports // guaranteed copy elision (c++17). Either way, it // doesn't affect the output. // bar_t () = delete; // bar_t (bar_t&&) = delete; // bar_t […]