Tag: C#的

为什么VB6.0表单显示为C#表单?

我有一个窗体的COM DLL。 此DLL由C#应用程序使用。 我为我的C#应用​​程序启用了视觉样式。 我不希望视觉样式应用于COM DLL的forms。 但是,当我运行我的应用程序和Lanuch COM DLL的forms,它有视觉风格应用到它。 我将如何防止它? 许多人build议使用清单。 但是,无论我在互联网上看到什么样的清单,他们都使用通用控件6.如何创build使用通用控件5.0的清单? 有些人还build议使用ActivationContext。 但是,这也需要使用常规控件5.0的正确清单吗? 请提出一些build议。

与任何types的参数匹配的C ++ variadic模板模板参数

我想知道是否有可能写一个模板函数,可以采取任何其他任意模板作为参数,并正确匹配模板名称(即不只是结果类)。 我所知道的工作是这样的: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); 这将匹配例如f(std::vector<int>())或f(std::list<int>())但不会为f(std::array<int, 3>()) ,因为第二个参数是size_t而没有types。 现在我想可以做一些疯狂的事情: template<template<typename …> class TemplateT, size… Sizes, typename… TemplateP> void f(const TemplateT<Sizes…, TemplateP…>& param); 希望编译器能正确地派生TemplateP省略号或Sizes省略号为空。 但是,这不仅丑陋,而且还适用于采用type或size_t参数的模板。 它仍然不会匹配例如与bool参数的任意模板。 重载方法也是如此: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); template<template<typename …> class TemplateT, size… Sizes> void f(const TemplateT<Sizes…>& param); 此外,如果我们想要混合size_t和typenames ,这种方法不会工作。 […]

Unity 2.0和处理IDisposabletypes(尤其是使用PerThreadLifetimeManager)

我知道类似的问题被问了几次(例如: 这里 , 这里 , 这里和这里 ),但它是以前版本的Unity,答案取决于使用的LifetimeManager类。 文档说: Unity使用从LifetimeManager基类inheritance的特定types(统称为生存期pipe理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例。 好吧,听起来不错,所以我决定在生命周期pipe理中检查构build的实现。 我的结论是: TransientLifetimeManager – 不处理处理。 容器只能parsing实例,并不会跟踪它。 调用代码负责处理实例。 ContainerControlledLifetimeManager – configuration生命期pipe理器时的实例(=configuration容器时)。 提供hiearchy中所有容器共享的单例实例。 HierarchicalLifetimeManager – 从ContainerControlledLifetimeManager派生行为。 它在hiearchy(子容器)中为每个容器提供“单例”实例。 ExternallyControlledLifetimeManager – 不处理处理。 正确的行为,因为容器不是实例的所有者。 PerResolveLifetimeManager – 不处理处理。 它通常与TransientLifetimeManager相同,但它允许在parsing整个对象图时重用dependency injection的实例。 PerThreadLifetimeManager – 不处理MSDN中描述的处理。 谁负责处理? 内置PerThreadLifetimeManager是: public class PerThreadLifetimeManager : LifetimeManager { private readonly Guid key = Guid.NewGuid(); [ThreadStatic] private static Dictionary<Guid, object> […]

为什么GCC -O3在filter迭代器上通过std :: deque产生无限的std :: distance?

经过很多的痛苦和苦难之后,我跟踪了一些非常奇怪的行为,当std::distance在给定范围的boost::filter_iterator时, std::distance永远不会返回std::deque 。 看来这个问题对于使用-O3优化的GCC(6.1+)来说是独一无二的。 这是一个certificate违规行为的例子: #include <string> #include <deque> #include <iterator> #include <iostream> #include <boost/iterator/filter_iterator.hpp> struct Foo { std::string bar, s = ""; char a = '\0'; }; int main() { const std::deque<Foo> foos(14, {""}); const std::string test {}; const auto p = [test] (const auto& foo) { return foo.bar == test; }; using boost::make_filter_iterator; […]

.Net规则引擎

我正在从一个规则引擎中受益的项目。 我已经考虑过使用Windows工作stream引擎,但我想知道还有什么。 我的项目花费了大部分预算。 所以我需要build议,适度定价(在<$ 1,000的范围内)。 我看到了InRule ,但他们没有发布价格(我可以看到)。 所以我猜这是“如果你不得不问你买不起”的那种产品。 我看到这篇文章: 在.NET中寻找简单的规则引擎库 但是它很老,专注于开源。 那么,那里有没有适当的.Net规则引擎?

如何避免代码重复实现常量和非常量迭代器?

我正在实现一个类似STL的接口的自定义容器。 我必须提供一个常规的迭代器和一个常量迭代器。 迭代器的两个版本的大部分代码是相同的。 我怎样才能避免这种重复? 例如,我的容器类是Foo ,我正在实现FooIterator和FooConstIterator 。 这两个迭代器都必须提供像operator++()这样的方法,它们是相同的。 我的问题类似于如何删除类似的const和非const成员函数之间的代码重复? ,但是这个答案是特定于const和非const方法的,特别是访问器。 我不明白这是如何推广到迭代器的问题。 我应该让FooIterator从FooIterator派生,并用额外的非const方法扩展吗? 这要么导致虚拟方法或方法隐藏,这在这里看起来不合适。 也许FooIterator应该包含一个FooConstIterator 。 虽然这种方法确实减less了重复实施,但似乎重新引入了很多样板方法的定义。 是否有巧妙的模板技术从一个单一的定义生成两个迭代器? 或者也许有一种方式 – 不寒而栗 – 使用预处理器来消除这些几乎相同的类。 我试着看看我的本地STL实现,看看它是如何处理这个。 有这么多的帮助类,我有困难的devise,但它看起来像function只是重复。 在以前的项目中,我的自定义容器是build立在标准STL容器之上的,所以我不必提供自己的迭代器。 在这种情况下,这不是一个选项。

在std :: multiset中是否有一个函数或algorithm来删除一个样本(unicate或duplicate),如果一个元素被find

也许这是一个重复,但我没有find任何search:当在std::multiset上调用erase(value)时,find的所有元素都被删除。 我能想到的唯一解决scheme是: std::multiset<int>::iterator hit(mySet.find(5)); if (hit!= mySet.end()) mySet.erase(hit); 这是好的,但我认为可能会更好。 有任何想法吗 ?

将空指针传递给新的位置

默认放置位置new运算符在18.6 [support.dynamic]¶1中用非抛出exception规范声明: void* operator new (std::size_t size, void* ptr) noexcept; 这个函数除了return ptr;外什么也不做return ptr; 所以它是合理的,但是根据5.3.4 [expr.new]¶15这意味着编译器必须检查它在调用对象的构造函数之前不会返回null: -15- [ 注意:除非使用非抛出exception规范(15.4)声明了分配函数,否则它表示抛出std::bad_allocexception来分配存储失败(条款15,18.6.2.1); 否则返回一个非空指针。 如果使用非抛出exception规范声明分配函数,则返回空值以指示分配存储失败,否则返回非空指针。 – 注意 ]如果分配函数返回null,则不进行初始化,不应该调用解除分配函数,new-expression的值应该为空。 在我看来,(特别是安置new ,不是一般的)这个空检查是一个不幸的performance打击,尽pipe很小。 我一直在debugging一些代码,其中放置new被用在一个性能敏感的代码path中,以改善编译器的代码生成,并且在程序集中检查了null。 通过提供一个特定于类的放置位置的new重载,这个重载是通过抛出的exception规范来声明的(即使它不可能抛出),条件分支也被移除了,这也允许编译器为周围的内联函数生成更小的代码。 说安置newfunction的结果可能会抛出,尽pipe它不能 ,是明显更好的代码。 所以我一直想知道是否真的需要空位检查new情况下安置。 它可以返回null的唯一方法是如果你通过它null。 虽然这是可能的,而且显然是合法的,写: void* ptr = nullptr; Obj* obj = new (ptr) Obj(); assert( obj == nullptr ); 我不明白为什么这将是有用的,我build议,如果程序员必须在使用安置之前明确地检查空 Obj* obj = ptr ? new (ptr) […]

Silverlight,Wpf Web应用程序(xbap)或单击一次? 优点和缺点

我们正在开始一个新的项目,我正在试图决定我们应该采取哪种Wpf-esque开发/部署策略。 在我们的例子中,我们正在看一个相当复杂的商业应用程序,将被100人(而不是1000人)使用,所以我倾向于一次点击一次的应用程序。 我的老板喜欢Silverlight应用程序的想法,因为这意味着更容易部署。 那么我们应该跳哪一条路? 答案当然是“要看情况”。 那么每个人的利弊是什么? 我会开始球滚动( 编辑添加在一些答案从artur carvalho ): Silverlight的 优点 跨浏览器 不需要完整的框架。 更好地控制用户。 如果你的用户login,你不必担心激活密钥或类似的东西。 它适用于Windows和Mac。 您可以轻松更新所有的用户应用程序。 缺点 不能与客户端的文件系统等进行交互 与完整的Wpf相比,function更less(任何人都有一个很好的文档差异资源?) 单个窗口 单一版本 Wpf Web应用程序(xbap) 优点 完整的Wpf。 缺点 单一浏览器 需要完整的框架 不能与客户端的文件系统等进行交互 单个窗口 单一版本 Wpf单击一次 优点 完整的Wpf 可以离线工作 多个窗口 多个版本(con?) 更好地访问计算机的低级别部分 没有停机维护 缺点 单一浏览器 需要完整的框架 稍微 (?)难以安装。

只移动std :: function的版本

因为std::function是可复制的,所以标准要求用于构造std :: function的可调用对象也是可复制的: n337(20.8.11.2.1) template<class F> function(F f); 要求: F应该是CopyConstructible。 对于参数typesArgTypes和返回typesR f应为Callable(20.8.11.2)。 A的拷贝构造函数和析构函数不得抛出exception 这意味着不可能从不可复制的绑定对象或捕获只移动types(如unique_ptr)的lambda形成std :: function。 这似乎有可能实现这种只移动的可移动的可移动的包装。 是否有一个标准的库移动只相当于std ::函数? 或者,这个问题是否有一个共同的解决方法?