ToolStripSplitButton和ToolStripDropDownButton有什么区别?(Visual Studio 2008)(此处也询问,而不是SO).乍一看,它们看起来大致相同; 特别是在设计师.
我想在 c++/cli 项目中使用托管 nuget 包。有没有办法做到这一点?
比如我的场景差不多是这样的:
我创建了一个 C# 项目(MainProject)并将 EntityFramework nuget 包添加到该项目中。
我又创建了一个 C# 项目(TestCSProject),并添加了 MainProject 作为对该项目的引用。然后自动在引用entityframework中也添加
我创建了一个 C++/CLI 项目(TestCLIProject),并添加了 MainProject 作为对该项目的引用,以便我想看看是否可以使用实体框架。
但那并没有发生。
所以我想知道如何在 c++/cli 项目中使用托管 nuget 包
使用C++/CLI 进行100%托管开发有哪些优点(可能存在的缺点列表)(即使用/ clr:safe编译,"生成...程序集,就像用C#编写的那样") )?尤其是当compard到C#(注意:C++/CLI:在C#中的优势和它有什么优势超过任何标准C++或C#中使用C++/CLI?大多是有关管理/非托管互操作).
例如,这里有几个我的头顶:
C++ - 托管类型的样式引用,不像完整的非可空引用那样优雅,但总比没有好或使用解决方法.
模板比泛型更强大
预处理器(这可能是一个缺点!,但宏可用于代码生成)
引用类型的堆栈语义 - 自动调用IDisposable :: Dispose()
通过C++析构函数更容易实现Dispose()
C#3.0添加了自动实现的属性,因此不再具有C++/CLI优势.
这个问题不是关于管理Windows路径名; 我仅将其用作不区分大小写的字符串的特定示例.(如果我现在改变这个例子,那么一大堆评论将毫无意义.)
这可能类似于可能创建不区分大小写的字符串类?,但那里没有很多讨论.此外,我并不真正关心所string享有的紧密语言集成或性能优化System.String.
比方说,我用了很多这些(正常)不区分大小写Windows路径名的(我不是真正关心的实际像路径的很多细节\对/,\\\\是一样的\,file://网址..等).一个简单的包装器可能是:
sealed class WindowsPathname : IEquatable<WindowsPathname> /* TODO: more interfaces from System.String */
{
public WindowsPathname(string path)
{
if (path == null) throw new ArgumentNullException(nameof(path));
Value = path;
}
public string Value { get; }
public override int GetHashCode()
{
return Value.ToUpperInvariant().GetHashCode();
}
public override string ToString()
{
return Value.ToString();
}
public override bool Equals(object obj)
{ …Run Code Online (Sandbox Code Playgroud) (另请参阅是否有一种很好的方法可以在C++中为自定义类型手写所有12个所需的Container函数?)
对于像这样的课程
namespace JDanielSmith {
class C
{
const size_t _size;
const std::unique_ptr<int[]> _data;
public:
C(size_t size) : _size(size), _data(new int[size]) {}
inline const int* get() const noexcept { return _data.get(); }
inline int* get() noexcept { return _data.get(); }
size_t size() const noexcept { return _size; }
};
}
Run Code Online (Sandbox Code Playgroud)
暴露迭代的首选方式是什么?我应该写begin()/ end()(和cbegin()/ cend())成员函数吗?
const int* cbegin() const {
return get();
}
const int* cend() const {
return cbegin() + size();
}
Run Code Online (Sandbox Code Playgroud)
或者这些应该是非会员职能? …
这是试图摆脱宏的另一种情况.考虑
void f_(int i) { printf("f_(int)\t%d\n", i); }
void f_(int i, double x) { printf("f_(int, double)\t%d, %5.3f\n", i, x); }
void g_(int i) { printf("g_(int)\t%d\n", i); }
void g_(int i, double x) { printf("g_(int, double)\t%d, %5.3f\n", i, x); }
Run Code Online (Sandbox Code Playgroud)
(想象一下f_()从.foo文件中获取数据或使用硬编码的"虚拟"值,g_()对.bar执行相同操作.)可能有一个函数来决定调用哪个重载:
void f(int i, double d) { (i > 0) ? f_(i, d) : f_(i); }
Run Code Online (Sandbox Code Playgroud)
具有相同的逻辑重复g_():
void g(int i, double x) { (i > 0) ? g_(i, x) : g_(i); …Run Code Online (Sandbox Code Playgroud) [这是TLDR ...对不起...]
我在一个包含数百个DLL的巨大(大部分)C++/MFC应用程序上工作; 它通过COM支持动态加载的"添加"机制,因此可以使用COM互操作在.NET中开发加载项.一些有限的新功能是在.NET中使用这种"插件"机制开发的(尽管仍然是动态加载的); 但是,最终用户可以决定不使用此功能.因此,.NET可能无法在启动时加载.
但是,.NET时被加载,我需要做一些特定的.NET initialzation(特别设置的CurrentUICulture匹配本地/非托管UI).
一种解决方案就是在代码到处加载新的.NET功能或COM加载项时简单地进行.NET初始化.鉴于此应用程序的性质,它可能是一个95 +%的解决方案(大多数用户将使用新功能).
但这不是万无一失的.有人可以通过构建带有/ clr标志的模块随时"随时"添加新的.NET功能(请记住,这是一个巨大的应用程序).
一个更强大(和明显)的解决方案是简单地导致.NET在启动时通过C++/CLI加载.但是,每个字节和时钟周期都很重要的一些顽固的C++开发人员并不想这样做; 有点可以理解,因为除非/直到加载.NET,否则不需要设置CurrentUICulture.
我想到的另一种可能性是挂钩LoadLibrary并寻找mscorlib.现在我知道.NET即将被加载由于某种原因,以正常方式加载它并在其他代码执行任何操作之前进行初始化.但是挂钩LoadLibrary(或其他任何事情)真的不是我想做的事情.
那么,是否有一种简单(更好)/更好的方式来判断是否要加载.NET?
编辑: Reed对LockClrVersion的回答非常接近.唯一的打嗝是,如果您在混合模式DLL /程序集中链接它将无法工作.
// ClrAboutToLoad.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <MSCorEE.h>
// http://community.bartdesmet.net/blogs/bart/archive/2005/07/22/2882.aspx
FLockClrVersionCallback begin_init, end_init;
STDAPI hostCallback()
{
printf("hostCallback()\n");
// we're in control; notify the shim to grant us the exclusive initialization right
begin_init();
ICLRRuntimeHost *pHost = NULL;
HRESULT hr …Run Code Online (Sandbox Code Playgroud) 这个问题的答案是什么了IEnumerable预期的性能?说没有办法知道迭代任意IEnumerable的性能.每次迭代都可以访问数据库或进行Web服务调用; 或者它可能只返回数组/列表中的下一个项目.
鉴于此,是否有一种很好的方式来表明"这很快"?例如,用T[]或List<T>代替IEnumerable<T>我知道从哪里T[i]开始T[i+1]会很快.(当然,强制枚举返回列表/数组可能会产生其他性能问题. List<T>还会暴露可编辑的语义.)
相反,返回IQueryable<T>而不是IEnumerable<T>一个表明"这很慢"的好方法?或许IEnumerable<Task<T>>?
客户C无法知道IEnumerable<T>s将具有截然不同的性能特征.
class C
{
readonly T[] m_data;
public IEnumerable<T> ThisWillIterateQuickly { get { return m_data; } }
public IEnumeralbe<T> ThisWillIterateSlowly
{
get
{
T retval = ... an expensive database call ...;
yield return retval;
}
}
public IQueryable<T> IsThisBetterForSlow { get { return ThisWillIterateSlowly; } }
public T[] IsThisAGoodWayForFast { get …Run Code Online (Sandbox Code Playgroud) class A
{
int value_;
public:
A(int value):value_(value){}
};
A get_a1(int value)
{
return A(value);
}
A get_a2(int value)
{
return {value};
}
int main()
{
A a1 = get_a1(1);
A a2 = get_a2(2);
}
Run Code Online (Sandbox Code Playgroud)
get_a1()和之间有什么区别get_a2()(如果有的话)?
怎么return {value};称呼?(我猜“通过大括号调用构造函数”不是引用此内容的正确方法)
为什么Microsoft的C++/CLI不允许我通过引用传递字符串?我收到以下错误:
C3699:'&':不能在类型'System :: String'上使用此间接
c++ ×5
.net ×4
c# ×3
c++-cli ×3
string ×2
.net-2.0 ×1
constructor ×1
ienumerable ×1
iqueryable ×1
iterator ×1
macros ×1
managed-c++ ×1
performance ×1
reference ×1
return ×1
scope ×1
stl ×1
templates ×1
winforms ×1