小编Iga*_*nik的帖子

识别IDisposable对象

我必须检查一些其他人有一些内存泄漏的代码.现在我正在搜索一次性对象以使用using语句对它们进行包围,我想知道是否有一种快速方式告诉你所有声明的一次性对象.我的意思是像resharper或另一个visual studio插件.

谢谢.

c# dispose memory-leaks idisposable using-statement

13
推荐指数
3
解决办法
3873
查看次数

枚举强名称CSP的容器名称

我正在尝试找到一些有关如何(如果可能的话)枚举强名称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将转储本地计算机密钥存储区:

--------- 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
-------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我可以看到[0]和[2]都是有效的容器名称AssemblyKeyName.但是,有[1]一个 - "IIS Express ...",它不是一个有效的容器.我如何区分它们?

.net strong-named-key

12
推荐指数
1
解决办法
2326
查看次数

通过DTE按类型名称查找ProjectItem

给定一个类型名称,是否可以使用DTE来查找该类型所在的ProjectItem?类似于Navigate To...对话框在Visual Studio 2010中的工作方式.

我能找到的最接近的是Solution.FindProjectItem,但这需要一个文件名.

谢谢!

vspackage envdte vs-extensibility projectitem

10
推荐指数
1
解决办法
4457
查看次数

Action的通用约束无法按预期工作

我无法理解为什么以下代码段不会给我一个错误

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.

任何人都可以解释为什么约束不允许这个编译?

.net c# generics covariance contravariance

9
推荐指数
2
解决办法
1108
查看次数

从Visual Studio运行时STARTUPINFO.wShowWindow为0

我在一个名为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:

从cmd发射

STARTUPINFO MSDN条目,该值wShowWindow应该匹配的值nCmdShow,如果dwFlagsSTARTF_USESHOWWINDOW在里面.但是,在两种情况下(从VS和cmd启动),值为dwFlags0.

那么,这是VS的一个问题还是我只是把它弄错了?

windows winapi visual-studio-2015

9
推荐指数
1
解决办法
789
查看次数

通过反射确定方法是否不安全

我正在寻找一种方法来过滤出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)

当然,这不会处理在方法中执行不安全块的情况,但同样,我感兴趣的是方法签名.

谢谢!

c# reflection unsafe

8
推荐指数
1
解决办法
1097
查看次数

通过命令行修改XML

我正在寻找一种更好的方法来修补XML(实际上是app.config文件).更具体地说,我需要在<appConfig>部分(可能不存在)中添加一些内容,以及<bindingRedirect>匹配条目的几个元素.

我还需要它作为命令行工具,以便于部署.

我想过以几种方式解决这个问题:

  1. 使用LINQ to XML修补文件的临时控制台应用程序 - 最简单
  2. 使用XSLT - 保存修改后的XML的副本,稍后替换原始版本(除非可以就地转换源XML?)
  3. 然而,使用XML Diff和Patch,似乎所产生的diffgram指的是精确的节点位置,例如<xd:node match="1">等.

ad-hoc解决方案是最简单的,但我觉得它有点作弊.我不太了解XSLT,但这听起来像是最好的解决方案......

在您看来,什么是"工作的最佳工具?"

.net xml xslt command-line linq-to-xml

8
推荐指数
1
解决办法
1835
查看次数

加载程序集并在其他appdomain中对其类型应用谓词

请阅读整个问题.我有一个独特的情况,有几个限制,我想解决.

在我的代码中,我有一个表达式树,编译成一个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)表示该 …

.net reflection resharper delegates appdomain

8
推荐指数
1
解决办法
1272
查看次数

如何在HtmlHelper扩展方法上获得控制器和动作的语法高亮?

我如何让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支持.工具如何接受它?

c# resharper visual-studio asp.net-mvc-3

8
推荐指数
1
解决办法
530
查看次数

无形-副产品中的重复数据删除类型

鉴于我有一种类型Int :+: Int :+: String :+: CNil,是否有简单的方法可以将其转换为Int :+: String :+: CNil

generics scala shapeless

8
推荐指数
2
解决办法
262
查看次数