小编Eug*_*sky的帖子

将代码注入到没有自定义属性的所有方法和属性的最简单方法

在Stack Overflow上有很多关于AOP in .NET的问题和解答,经常提到PostSharp和其他第三方产品.因此,在.NET和C#世界中似乎有相当多的AOP选项.但是每个都有它们的限制,在下载了有希望的PostSharp之后我在他们的文档中发现'方法必须是虚拟的'才能注入代码(编辑:请参阅ChrisWue的答案和我的评论 - 虚拟约束必须有我猜想,他是其中一个竞争者.我还没有进一步调查这个陈述的准确性,但是它的分类让我回到Stack Overflow.

所以我想回答这个非常具体的问题:

我想在我的项目中没有自定义的每个方法和属性(静态,密封,内部,虚拟,非虚拟,无关紧要)注入简单的 "if(some-condition)Console.WriteLine"样式代码注释,以便在运行时动态测试我的软件.这个注入的代码不应该保留在发布版本中,它只是用于在开发期间进行动态测试(与线程相关).

最简单的方法是什么?我偶然发现Mono.Cecil,它看起来很理想,除了你似乎必须编写你要在IL中注入的代码.这不是一个大问题,使用Mono.Cecil很容易获得用C#编写的IL版本的代码.但是,如果有更简单的东西,理想情况下甚至可以内置到.NET中(我仍然在.NET 3.5上),我想知道.[更新:如果建议的工具不是.NET Framework的一部分,那么如果它是开源的,如Mono.Cecil,或者免费提供,那就太好了]

.net c# aop code-injection

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

是否可以预先生成NGen图像,以便客户不必这样做?

我们的应用程序通过ClickOnce分发,平均需要10.8秒才能启动.在ngen.exe上运行后(在ClickOnce安装它的目录中),平均启动时间为6.4秒.这显然是一个巨大的加速(40%),如果可能的话我想利用ngen-ification.

Ron的回答是否有可能将NGen用于ClickOnce部署?显示如何在客户的机器上完成它,假设我猜他运行的是Windows XP,因为它想要我的Windows 7机箱上的管理员权限,所以这似乎不是一般的解决方案.

此外,ngen 在我的盒子上花了40秒来编译属于该应用程序的所有程序集.

理想情况下,我希望将所有(主要)架构的应用程序作为构建过程的一部分,因此可以将其发送给客户,而无需用户接受"可以作为管理员执行".弹出然后等待40秒.

那可能吗?

clickonce ngen

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

使用nailgun加快clojure启动时间

时不时地,我认为这将是很好用clojureshell脚本,但大约900毫秒的启动时间太慢.然后我会google startpage for"nailgun clojure",但唯一显示的结果是针对vimclojure这样的特殊情况.那时我假装没有时间,转向awk更快启动的更多病房语言.

那么,怎样才能nailgun加快clojure的启动时间呢?

shell clojure startup nailgun

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

ConcurrentDictionary的乐观并发Remove方法

我在ConcurrentDictionary中寻找一个方法,允许我按键删除一个条目,当且仅当该值等于我指定的值时,类似于TryUpdate,但是对于删除.

执行此操作的唯一方法似乎是此方法:

ICollection<KeyValuePair<K, V>>.Remove(KeyValuePair<K, V> keyValuePair)
Run Code Online (Sandbox Code Playgroud)

它是ICollection接口的显式实现,换句话说,我必须首先将ConcurrentDictionary转换为ICollection,以便我可以调用Remove.

删除完全符合我的要求,并且该投射也没什么大不了的,源代码也显示它调用私有方法TryRemovalInternal与bool matchValue = true,所以它看起来都很漂亮和干净.

然而,令我担心的是,它没有被记录为ConcurrentDictionary的乐观并发Remove方法,因此http://msdn.microsoft.com/en-us/library/dd287153.aspx只是重复ICollection样板,并且该如何从一个ConcurrentDictionary添加和删除的项目并不要么提到的方法.

有谁知道这是否可行,或者是否有其他方法我缺席?

.net optimistic-concurrency

7
推荐指数
1
解决办法
922
查看次数

有没有办法将元数据添加到JavaScript对象?

我想将元数据的键值对添加到任意JavaScript对象.此元数据不应影响不了解元数据的代码,例如,这意味着

JSON.stringify(obj) === JSON.stringify(obj.WithMetaData('key', 'value'))
Run Code Online (Sandbox Code Playgroud)

元数据感知代码应该能够通过密钥检索数据,即

obj.WithMetaData('key', 'value').GetMetaData('key') === 'value'
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点 - 在node.js?如果是这样,它是否适用于内置类型String ,甚至是Number?(编辑思考它,我不关心像数字这样的真实原语,但是对于字符串实例来说这很好).

一些背景:我要做的是缓存从具有对象本身的对象派生的值,以便这样做

  • 对于元数据不知情的代码,元数据丰富的对象将看起来与原始对象w/o元相同
  • 如果已缓存,则需要派生值的代码可以从元数据中获取它
  • 缓存将在对象旁边收集垃圾

另一种方法是在某处存储带有缓存的哈希表,但是你永远不知道对象何时被垃圾收集.必须手动处理每个对象实例,以便缓存不会泄漏.

(btw clojure有这个功能:http://clojure.org/metadata)

javascript v8 node.js

7
推荐指数
2
解决办法
5194
查看次数

地板整数除法

在 C# 中是否有一种简单、高效和正确(即不涉及到/从 double 转换)的方法来进行地板整数除法(例如Python 提供)。

换句话说,以下的有效版本,不会遭受长/双转换损失。

(long)(Math.Floor((double) a / b))
Run Code Online (Sandbox Code Playgroud)

还是必须自己实现它,例如

static long FlooredIntDiv(long a, long b)
{
    if (a < 0)
    {
        if (b > 0)
            return (a - b + 1) / b;
        // if (a == long.MinValue && b == -1) // see *) below
        //    throw new OverflowException();
    }
    else if (a > 0)
    {
        if (b < 0)
            return (a - b - 1) / b;
    }
    return a / …
Run Code Online (Sandbox Code Playgroud)

.net c# math integer-arithmetic

7
推荐指数
1
解决办法
8062
查看次数

高效地将字节数组转换为十进制

如果我有一个字节数组,并且想要将该数组的连续 16 字节块(包含 .net 的Decimal, 表示形式)转换为正确的Decimal结构,那么最有效的方法是什么?

在我正在优化的情况下,以下代码在我的分析器中显示为最大的 CPU 消耗者。

public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
    using (MemoryStream stream = new MemoryStream(src))
    {
        stream.Position = offset;
        using (BinaryReader reader = new BinaryReader(stream))
            return reader.ReadDecimal();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了摆脱MemoryStreamand ,我认为将sBinaryReader数组输入到构造函数中会比我下面介绍的解决方案更快,但奇怪的是,下面的版本快了一倍。BitConverter.ToInt32(src, offset + x)Decimal(Int32[])

const byte DecimalSignBit = 128;
public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
    return new decimal(
        BitConverter.ToInt32(src, offset),
        BitConverter.ToInt32(src, offset + 4),
        BitConverter.ToInt32(src, offset + 8),
        src[offset + …
Run Code Online (Sandbox Code Playgroud)

.net c# decimal

6
推荐指数
1
解决办法
2万
查看次数

注册 I/O 的 Unix/Linux 等价物是什么?

Windows 8 和 Server 2012 支持RIO,它允许您预先注册 I/O 缓冲区一次,然后重复使用这些相同的缓冲区,从而避免其他(显然)必要的每个 I/O 操作缓冲区检查。

RIO 还允许完全在用户模式下完成诸如轮询之类的完成操作,而无需进行系统调用。

(如何)这在 Linux/Unix 上是可能的吗?

unix linux network-programming winsock

6
推荐指数
1
解决办法
1539
查看次数

什么情况下endOffset&gt;lastMsg.offset+1?

Kafka 对于分区返回 endOffset 15,但可以使用的最后一条消息的偏移量为 13,而不是我期望的 14。我想知道为什么。

卡夫卡文档阅读

在默认的read_uncommissed隔离级别下,结束偏移量是高水位线(即最后成功复制的消息的偏移量加一)。对于read_commited消费者来说,结束偏移量是最后一个稳定偏移量(LSO),它是高水位线的最小值和任何打开事务的最小偏移量。

这是 kafkacat 的输出。我使用 kafkacat,因为它可以打印消息偏移量:

$ kafkacat -Ce -p0 -tTK -f'offset: %o key: %k\n'
offset: 0 key: 0108
offset: 1 key: 0253
offset: 4 key: 0278
offset: 5 key: 0198
offset: 8 key: 0278
offset: 9 key: 0210
offset: 10 key: 0253
offset: 11 key: 1058
offset: 12 key: 0141
offset: 13 key: 1141
% Reached end of topic TK [0] at offset 15: exiting
Run Code Online (Sandbox Code Playgroud)

同样令人困惑的是——而且很可能是相关的——偏移量不是连续的,尽管我还没有设置压缩等。

更多细节:

$ kafka-topics.sh --bootstrap-server localhost:9092 …
Run Code Online (Sandbox Code Playgroud)

apache-kafka kafka-consumer-api

6
推荐指数
1
解决办法
740
查看次数

SortedList.IndexOfKey(key) 返回 item.key &gt;= key 的项目的索引

如果不在列表中,SortedList<TKey, TValue>.IndexOfKey(key)返回 -1 。

这是否意味着如果我想在列表中找到大于或等于key的键的索引,我必须自己实现二进制搜索?还是我忽略了一些开箱即用的东西?

我当然想得到 O(log(n)) 的结果,所以请不要使用 LINQ 迭代和过滤魔法。

(一般来说,我想要像 Java 的 NavigableMap 功能,即在排序的地图/字典上进行高效迭代等功能,但就目前而言,上述问题的答案就足够了,我可以按照自己的方式“扩展方法”从那里以某种方式)

.net sortedlist

5
推荐指数
1
解决办法
1108
查看次数