我需要检查两个MethodInfos之间的相等性.它们实际上是完全相同的MethodInfo,但ReflectedType除外(也就是说,DeclaringType是相同的,并且方法实际上应该具有相同的主体).有很多方法可以做到这一点,但我正在寻找最有效的方法.
现在我有:
public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second)
{
first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray());
second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray());
return first == second;
}
Run Code Online (Sandbox Code Playgroud)
这有点贵,所以我想知道是否有更好的方法......
我应该比较两个方法体吗?例如.
first.GetMethodBody() == second.GetMethodBody()
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在做一些后期构建CIL编织,它将CIL添加到程序集中的所有方法(换句话说,大量方法).每个方法检查特定值是否为空.示例(C#Reflector'd版本的CIL代码):
// CIL woven region start
if (MyType.Something == null) {
// ... some new stuff
}
// CIL woven region end
Run Code Online (Sandbox Code Playgroud)
将MyType.Something作为属性与字段的性能影响是什么?我知道我已经读过C#编译器执行特殊的优化,在这种情况下应该没有性能影响......但是在直接CIL代码(没有C#编译器)的情况下......?或者它是允许这些优化的JIT编译器(因此直接CIL代码仍然有益)?
为静态属性的访问器发出OpCode.Call会有比Ldsfld差的性能(请记住,由于程序集中的每个方法都是编织的,因此这涉及成千上万的调用)?
谢谢.
我正在尝试设计一个公开添加异步处理问题的能力的类。在同步编程中,这可能看起来像
public class ProcessingArgs : EventArgs
{
public int Result { get; set; }
}
public class Processor
{
public event EventHandler<ProcessingArgs> Processing { get; }
public int Process()
{
var args = new ProcessingArgs();
Processing?.Invoke(args);
return args.Result;
}
}
var processor = new Processor();
processor.Processing += args => args.Result = 10;
processor.Processing += args => args.Result+=1;
var result = processor.Process();
Run Code Online (Sandbox Code Playgroud)
在异步世界中,每个关注点都可能需要返回一个任务,这并不是那么简单。我已经看到了很多方法,但我很好奇人们是否找到了任何最佳实践。一种简单的可能性是
public class Processor
{
public IList<Func<ProcessingArgs, Task>> Processing { get; } =new List<Func<ProcessingArgs, Task>>();
public async Task<int> ProcessAsync() …Run Code Online (Sandbox Code Playgroud) 我想从我的常规.NET 3.5应用程序中使用Mono的编译器作为服务.
我已经下载了最新的位(2.6.7),在Visual Studio中创建了一个简单的控制台应用程序并引用了Mono.CSharp dll.
然后,在我的控制台应用程序中(直接在线样本):
Evaluator.Run("using System; using System.Linq;");
bool ress;
object res;
Evaluator.Evaluate(
"from x in System.IO.Directory.GetFiles (\"C:\\\") select x;",
out res, out ress);
foreach (var v in (IEnumerable)res)
{
Console.Write(v);
Console.Write(' ');
}
Run Code Online (Sandbox Code Playgroud)
这会在Evaluator.Run(第一行)引发异常:
Illegal enum value: 2049.
Parameter name: access
Run Code Online (Sandbox Code Playgroud)
这是因为dll是使用Mono.exe编译的,而不是csc.exe,我相信.
我已经尝试直接从demo-repl.zip文件中的http://tirania.org/blog/archive/2010/Apr-27.html下载Mono.CSharp dll ......这不会引发异常. ..但是在调用Evaluator.Evaluate之后out参数(res)是null ...所以我不确定出了什么问题.没有例外被抛出......
所以,我想弄清楚为什么我从demo-repl.zip下载的dll返回null.
编辑:我弄清楚它为什么返回null.看起来由于某种原因,编译器没有拿起System.Linq命名空间......虽然我不知道为什么......如果我只是评估"System.IO.Directory.GetFiles(\"C:\\ ")",它工作正常.
更新:看起来Mono编译器拾取引用的系统程序集似乎有问题.如果我直接复制其csharp控制台工具的示例:
csharp> var list = new int [] {1,2,3};
csharp> var b = from x in list
> where x > 1
> select x; …Run Code Online (Sandbox Code Playgroud) 我在Windows 7上运行IIS 7.5.我的ASP .NET应用程序使用VirtualPathProvider.我的VirtualPathProvider返回并渲染了大多数文件(aspx页面).静态文件(css/images)不是.如果我尝试直接浏览它们(或者如果它们被我的虚拟aspx页面引用),它们会产生HTTP 404错误
我已经验证了我的web.config具有为静态文件类型注册的正确处理程序.
这有点奇怪:
如果我尝试浏览非虚拟gif文件(实际存在于网站根目录下的文件系统上的文件),则呈现正常.
如果我在Visual Studio中使用WebDev而不是IIS运行,则虚拟gif文件可以正常呈现.
在调试模式中VirtualPathProvider.GetFile,我可以看到我的VirtualPathProvider在页面返回404错误之前返回一个完全有效的虚拟gif文件实例...所以我知道我的VirtualPathProvider工作得很好.
注意,当我说IIS时,我并不是说在部署环境中.我只是意味着将项目设置切换为使用IIS而不是WebDev.
有任何想法吗?
谢谢.
Azure Functions错误.我在门户网站上收到错误
Error:
We are not able to retrieve the runtime master key. Please try again later.
Session Id: d13fceebd4ea4cb1b7fb3d3829dd1406
Timestamp: 2017-08-24T20:04:23.555Z
Run Code Online (Sandbox Code Playgroud)
我在这里尝试了所有的建议:https: //blogs.msdn.microsoft.com/jpsanders/2017/05/09/function-app-error-we-are-not-able-to-retrieve-the-运行时主键/
我正在使用运行时版本1.0.10917但我已经尝试过~1并获得相同的结果.
当我从门户中删除该函数然后重新创建它时,似乎会发生这种情况.对于我们拥有的每项功能,它始终如一地发生.第一次创建函数时,它似乎有效.
我正在使用Castle Windsor for SL v2.5.1.0.我有代理内部类(当然接口是公共的,但实现是内部的,所以消费者只知道接口).
我在使用内部类的程序集中使用以下属性
[assembly: InternalsVisibleTo("Castle.Core, PublicKey=002400000480000094000000060200000024000052534131000400000100010077F5E87030DADCCCE6902C6ADAB7A987BD69CB5819991531F560785EACFC89B6FCDDF6BB2A00743A7194E454C0273447FC6EEC36474BA8E5A3823147D214298E4F9A631B1AFEE1A51FFEAE4672D498F14B000E3D321453CDD8AC064DE7E1CF4D222B7E81F54D4FD46725370D702A05B48738CC29D09228F1AA722AE1A9CA02FB")]
[assembly: InternalsVisibleTo("Castle.Windsor, PublicKey=002400000480000094000000060200000024000052534131000400000100010077F5E87030DADCCCE6902C6ADAB7A987BD69CB5819991531F560785EACFC89B6FCDDF6BB2A00743A7194E454C0273447FC6EEC36474BA8E5A3823147D214298E4F9A631B1AFEE1A51FFEAE4672D498F14B000E3D321453CDD8AC064DE7E1CF4D222B7E81F54D4FD46725370D702A05B48738CC29D09228F1AA722AE1A9CA02FB")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
Run Code Online (Sandbox Code Playgroud)
在完整的.NET 4.0模式下,使用.NET 4.0 Castle程序集,这很好,我的类型代理正常.在Silverlight中,使用Silverlight Castle程序集,我得到:
Type ConsoleApplication4.MyTypeToBeProxied is not public. Can not create proxy for types that are not accessible.
Run Code Online (Sandbox Code Playgroud)
此外,只是在解决问题,添加以下似乎没有区别......:
[assembly: InternalsVisibleTo("System.Core, PublicKey=00000000000000000400000000000000")]
[assembly: InternalsVisibleTo("System.Core, PublicKey=" +
"00240000048000009400000006020000002400005253413100040000010001008d56c76f9e8649" +
"383049f383c44be0ec204181822a6c31cf5eb7ef486944d032188ea1d3920763712ccb12d75fb7" +
"7e9811149e6148e5d32fbaab37611c1878ddc19e20ef135d0cb2cff2bfec3d115810c3d9069638" +
"fe4be215dbf795861920e5ab6f7db2e2ceef136ac23d5dd2bf031700aec232f6c6b1c785b4305c" +
"123b37ab")]
Run Code Online (Sandbox Code Playgroud)
我还在运行时验证了SL中动态托管程序集的名称实际上仍然是DynamicProxyGenAssembly2.
有任何想法吗?谢谢.
编辑:
我发现了我认为的问题:
Castle 4.0 for .NET具有:
private bool IsAccessible(Type target)
{
// ....
return ((target.IsPublic || target.IsNestedPublic) || internalAndVisibleToDynProxy);
}
Run Code Online (Sandbox Code Playgroud)
在DefaultProxyBuilder中...和SL 4有
private bool IsAccessible(Type target) …Run Code Online (Sandbox Code Playgroud) 我有一个.NET System.Threading.Timer计时器,每隔60秒滴答一次,并在每个滴答声中引入内存泄漏.
在计时器的每个刻度上,代码分配一个IDisposable对象(称为SocketsMessageConnector)......但我确实正确处理它.
我运行了.NET Memory Profiler,每60秒我看到一个新的SocketsMessageConnector类实例在内存中停留(所以在15分钟后,我有15个实例).内存分析器验证实例是否已被释放,但它显示了一个以TimerCallback为根的实例,该实例以_TimerCallback为根,该查询以GCHandle为根...
什么在这里?为什么TimerCallback保持在每个计时器滴答上创建的新实例?
PS.在拍摄快照之前,探查器会强制2个GC,因此我知道它实际上是泄漏,而不仅仅是GC的优化.
有几篇关于此的文章,我有这个工作...但我想知道如何为我的Observable订阅一次设置最大数量的任务线程.
我有以下内容来并行化异步保存日志条目:
private BlockingCollection<ILogEntry> logEntryQueue;
Run Code Online (Sandbox Code Playgroud)
和
logEntryQueue = new BlockingCollection<ILogEntry>();
logEntryQueue.GetConsumingEnumerable().ToObservable(Scheduler.TaskPool).Subscribe(SaveLogEntry);
Run Code Online (Sandbox Code Playgroud)
要安排我的保存...但是如何指定调度程序一次使用的最大线程数?
我正在寻找一个开源的HL7 V3临床文档架构API.最好是与nHapi(用于构建特定消息类型的结构化对象模型)完全相同的东西,除了它具有用于创建V3消息的消息类(不仅仅是像nHapi那样的v2.x消息).
我看过MirthConnect,但这主要是基于Java和Javascript的......我还没有在Google看到任何真正强大的候选人,所以我希望这里的某个人可能知道一个.
.net ×6
c# ×5
reflection ×2
asp.net ×1
async-await ×1
asynchronous ×1
azure ×1
cda ×1
gmcs ×1
hl7 ×1
hl7-cda ×1
iis-7.5 ×1
mono ×1
timer ×1