我必须检查一些其他人有一些内存泄漏的代码.现在我正在搜索一次性对象以使用using语句对它们进行包围,我想知道是否有一种快速方式告诉你所有声明的一次性对象.我的意思是像resharper或另一个visual studio插件.
谢谢.
我正在尝试找到一些有关如何(如果可能的话)枚举强名称CSP(加密服务提供程序)中的所有容器名称的信息.
实质上,当您键入时sn.exe -i key.snk MyContainerName,公钥和私钥对存储在所谓的"容器"中.稍后,在您的代码中,您可以指定容器名称AssemblyKeyNameAttribute,例如:
[assembly: AssemblyKeyName("MyContainerName")]
Run Code Online (Sandbox Code Playgroud)
这将导致程序集在编译时签名.
我试图找出是否有可能以某种方式枚举所有容器名称.我正在为ReSharper编写一个插件,为InternalsVisibleTo属性提供代码完成.我还想为AssemblyKeyName属性提供代码完成,我将使用已知的容器名称预先填充列表.
这些信息是否可访问?
编辑:从IT Security StackExchange 对这个问题的评论中,有一个名为KeyPal的小工具的链接.运行此实用程序LM将转储本地计算机密钥存储区:
Run Code Online (Sandbox Code Playgroud)--------- KeyPal: MACHINE store: 3 keycontainers --------- [0] VS_KEY_F726FDF898BC4CB8 Signature 1024 [1] IIS Express Development Certificate Container Exchange 1024 CertE: CN=localhost [2] MyContainerName Signature 1024 -------------------------------------------------
我可以看到[0]和[2]都是有效的容器名称AssemblyKeyName.但是,有[1]一个 - "IIS Express ...",它不是一个有效的容器.我如何区分它们?
给定一个类型名称,是否可以使用DTE来查找该类型所在的ProjectItem?类似于Navigate To...对话框在Visual Studio 2010中的工作方式.
我能找到的最接近的是Solution.FindProjectItem,但这需要一个文件名.
谢谢!
我无法理解为什么以下代码段不会给我一个错误
public void SomeMethod<T>(T arg) where T : MyInterface
{
MyInterface e = arg;
}
Run Code Online (Sandbox Code Playgroud)
但是这个,我期望由于泛型类型约束而工作
private readonly IList<Action<MyInterface>> myActionList = new List<Action<MyInterface>>();
public IDisposable Subscribe<T>(Action<T> callback) where T: MyInterface
{
myActionList.Add(callback); // doesn't compile
return null
}
Run Code Online (Sandbox Code Playgroud)
给出了这个错误
cannot convert from 'System.Action<T>' to 'System.Action<MyInterface>'
Run Code Online (Sandbox Code Playgroud)
我正在使用VS2012 sp1和.NET 4.5.
任何人都可以解释为什么约束不允许这个编译?
我在一个名为Notepad2的开源记事本替换中调试一个功能时遇到了一个问题(更具体地说,是一个名为Notepad2-mod的更新的分支).
它有一个标志/u,使应用程序在管理权限下重新启动(使用runas带有ShellExecute的动词).代码看起来像这样(为简洁起见):
STARTUPINFO si;
SHELLEXECUTEINFO sei;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
...
sei.lpVerb = L"runas";
sei.lpFile = lpArg1;
sei.lpParameters = lpArg2;
sei.nShow = si.wShowWindow;
ShellExecuteEx(&sei);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,如果我从Visual Studio启动它(无论是否附加调试器),提升的子进程'主窗口就不会显示!它将出现在Process Explorer中,但没有可见的窗口.
通过调查,我意识到从Visual Studio启动时nCmdShow传递给子进程' WinMain为0(对应于SW_HIDE)!随后将该值传递给了ShowWindow,这就是它没有显示的原因.
当尝试从cmd shell启动它时,一切正常.
经过进一步调查,结果发现,在VS中运行时si.wShowWindow,通过调用获得的值为GetStartupInfo0,但从cmd启动时为1:
据STARTUPINFO MSDN条目,该值wShowWindow应该匹配的值nCmdShow,如果dwFlags有STARTF_USESHOWWINDOW在里面.但是,在两种情况下(从VS和cmd启动),值为dwFlags0.
那么,这是VS的一个问题还是我只是把它弄错了?
我正在寻找一种方法来过滤出unsafe通过反射具有修饰符的方法.它似乎不是方法属性.
有办法吗?
编辑:似乎这个信息不在元数据中,至少我在IL中看不到它.但是反射unsafe器在C#视图中显示修改器.关于它是如何完成的任何想法?
编辑2:根据我的需要,我最终得到了一个检查,假设如果方法的某个参数是指针,或者返回类型是指针,那么该方法是不安全的.
public static bool IsUnsafe(this MethodInfo methodInfo)
{
if (HasUnsafeParameters(methodInfo))
{
return true;
}
return methodInfo.ReturnType.IsPointer;
}
private static bool HasUnsafeParameters(MethodBase methodBase)
{
var parameters = methodBase.GetParameters();
bool hasUnsafe = parameters.Any(p => p.ParameterType.IsPointer);
return hasUnsafe;
}
Run Code Online (Sandbox Code Playgroud)
当然,这不会处理在方法中执行不安全块的情况,但同样,我感兴趣的是方法签名.
谢谢!
我正在寻找一种更好的方法来修补XML(实际上是app.config文件).更具体地说,我需要在<appConfig>部分(可能不存在)中添加一些内容,以及<bindingRedirect>匹配条目的几个元素.
我还需要它作为命令行工具,以便于部署.
我想过以几种方式解决这个问题:
<xd:node match="1">等.ad-hoc解决方案是最简单的,但我觉得它有点作弊.我不太了解XSLT,但这听起来像是最好的解决方案......
在您看来,什么是"工作的最佳工具?"
请阅读整个问题.我有一个独特的情况,有几个限制,我想解决.
在我的代码中,我有一个表达式树,编译成一个Predicate<System.Type>.我的目标是加载程序集而不锁定它(它是项目的输出程序集,不断重建),将此谓词应用于其类型列表并返回结果类型名称列表:
// this is what I need:
return assembly.GetTypes().Where(t => predicate(t)).Select(t => t.FullName);
Run Code Online (Sandbox Code Playgroud)
这个程序集应该加载到另一个appdomain中,因为我想在得到我需要的信息后立即卸载它.
这是它变得棘手的地方.我面临几个问题:
如果我在另一个appdomain中加载程序集并简单地返回所有类型的数组,那么我可以将谓词应用到我的主appdomain中,只要将类型编组回我的主应用程序域,我就会得到一个FileNotFoundException,说明找不到这个组件.这样就可以了,因为程序集只是在我创建的另一个appdomain中加载.在主应用程序域中加载它也会失败.
或者,如果我尝试将谓词传递到另一个appdomain,在那里应用它并返回一个字符串数组(完整类型名称),我得到一个SerializationException: "Cannot serialize delegates over unmanaged function pointers, dynamic methods or methods outside the delegate creator's assembly.",因为谓词是一个动态方法(从表达式树编译) .
将它加载到主应用程序域中将不会出现这些问题,但由于在卸载整个应用程序域时无法卸载已加载的程序集,因此只要程序集发生更改(重建后),任何尝试加载具有相同名称的程序集会导致例外.
上下文:
我正在为ReSharper构建一个名为Agent Mulder的插件.插件背后的想法是分析解决方案中的DI/IoC Container注册,并帮助ReSharper找出通过DI Container注册的类型的使用情况(您可以在这里观看有关其工作原理的简短视频).
在大多数情况下,分析容器注册很简单 - 我只需要检测足够的信息以了解哪些具体类型受到影响.在Castle Windsor的这个例子中:Component.For<IFoo>().ImplementedBy<Foo>()结果类型是显而易见的,所以AllTypes.FromThisAssembly().BasedOn<IFoo>()- 给我足够的信息来猜测将被这条线影响的具体类型.但是,请考虑在温莎城堡注册:
container.Register(Classes
.FromAssemblyInDirectory(new AssemblyFilter(".").FilterByName(an => an.Name.StartsWith("Ploeh.Samples.Booking")))
.Where(t => !(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dispatcher<>)))
.WithServiceAllInterfaces());
Run Code Online (Sandbox Code Playgroud)
(来源)
这里的信息取决于只在运行时进行评估的谓词.
由于我所能做的就是对此进行静态分析,因此我手中有ReSharper的AST(在ReSharper中称为PSI)表示该 …
我如何让Visual Studio提供控制器和动作语法高亮显示,如下所示为控制器和操作字符串提供自己的对象?
当你使用:
Html.Action("Index", "Home");
Run Code Online (Sandbox Code Playgroud)
Visual Studio在控制器和操作上提供了额外的突出显示,它甚至尝试检测哪些可用,并将其作为选项提供.
请注意下图中的内容,它为我提供了基于我输入的控制器的操作选项.这就是我想要的自定义代码.

我有完美的HtmlHelper扩展方法,类似于以下内容:
public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName, string myAwesomeField) {
return Action(htmlHelper, actionName, controllerName, null /* routeValues */, myAwesomeField);
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要一些字符串,我的扩展方法被智能感知所吸引.当您查看Microsoft的代码时,action和controller的参数是字符串,但Visual Studio知道这些控制器和操作是否存在并提供额外的 intellisense支持.工具如何接受它?
鉴于我有一种类型Int :+: Int :+: String :+: CNil,是否有简单的方法可以将其转换为Int :+: String :+: CNil?
.net ×4
c# ×4
generics ×2
reflection ×2
resharper ×2
appdomain ×1
command-line ×1
covariance ×1
delegates ×1
dispose ×1
envdte ×1
idisposable ×1
linq-to-xml ×1
memory-leaks ×1
projectitem ×1
scala ×1
shapeless ×1
unsafe ×1
vspackage ×1
winapi ×1
windows ×1
xml ×1
xslt ×1