小编Ill*_*ack的帖子

为什么 TypedReference.MakeTypedReference 如此受限?

我终于明白了该方法的用法TypedReference.MakeTypedReference,但为什么参数如此有限?底层的 private可以做比限制字段数组有元素和字段类型为非原始的InternalMakeTypedReference(void* result, object target, IntPtr[] flds, RuntimeType lastFieldType)更多的事情。MakeTypedReference

我制作了一个示例使用代码,展示了它的全部可能性:

private static readonly MethodInfo InternalMakeTypedReferenceMethod = typeof(TypedReference).GetMethod("InternalMakeTypedReference", flags);
private static readonly Type InternalMakeTypedReferenceDelegateType = ReflectionTools.NewCustomDelegateType(InternalMakeTypedReferenceMethod.ReturnType, InternalMakeTypedReferenceMethod.GetParameters().Select(p => p.ParameterType).ToArray());
private static readonly Delegate InternalMakeTypedReference = Delegate.CreateDelegate(InternalMakeTypedReferenceDelegateType, InternalMakeTypedReferenceMethod);

public static void MakeTypedReference([Out]TypedReference* result, object target, params FieldInfo[] fields)
{
    IntPtr ptr = (IntPtr)result;
    IntPtr[] flds = new IntPtr[fields.Length];
    Type lastType = target.GetType();
    for(int i = 0; i < fields.Length; i++)
    {
        var field = fields[i];
        if(field.IsStatic)
        { …
Run Code Online (Sandbox Code Playgroud)

c# clr interop typedreference

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

通用类型的指针

为什么在C#中使用泛型类型的指针无效?int?*无效,typeof(int?).MakePointerType()但不产生异常.

根据MSDN,指针可以是:

sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool.

任何枚举类型.

任何指针类型.

任何用户定义的结构类型,仅包含非托管类型的字段.

我没有看到任何与泛型有关的限制.int?看起来有效,因为它只包含一个boolint字段.

c# generics pointers

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

在JIT/AOT编译期间,CIL ldstr是否被替换为对string.Intern的常量引用?

假设我有一个需要优化但同时易于调试的代码.因此,我会为我使用的每个值分配一个字符串.该字符串是否会造成重大性能损失,或者它是否变成了一个从string.Intern在JIT/ AOTcompilation中获得的常量引用,从而变成一条简单的指令?

例:

在IL中它会是ldstr "gazilion lines".

它是在JIT/AOT编译期间变成类似的东西ldsflda string.InternCache.ID_0000647516166 并被const string ID_0000647516166 = "gazilion lines"; 添加到string.InternCache

是的,我理论上可以查看https://github.com/mono/mono但我不知道如何找到它.

是的,我正在混合使用CIL,C#以及编译的CIL,但是你明白了.

ldstr保证是O(1)

是的,它是CLR的"实现细节",但如果以这种方式进行优化,那将是有意义的.

c# string il cil

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

如何在模板类中匹配模板好友功能

我有一个模板类,它声明一个具有模板参数的友函数。代码如下:

template <class T>
class C;

template <class T, class U>
void func(C<T>& t);

template <class T>
class C
{
    template <class U>
    friend void func<T, U>(C<T>& t);
private:
    template <class U>
    void f()
    {

    }
};

template <class T, class U>
void func(C<T>& t)
{
    t.f<U>();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试调用时func,在此friend行出现编译错误:

'func':找不到匹配的重载函数

我该如何交func<T, U>朋友C<T>

c++ templates friend

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

对象实例仅对当前方法有效

是否可以创建一个对象,该对象可以注册当前线程是否离开创建它的方法,或者检查实例上的方法被调用时是否发生了这种情况?

ScopeValid obj;

void Method1()
{
    obj = new ScopeValid();
    obj.Something();
}

void Method2()
{
    Method1();
    obj.Something(); //Exception
}
Run Code Online (Sandbox Code Playgroud)

这项技术能否实现?我想开发一种类似于TypedReference和的机制ArgIterator,它不能"逃避"当前的方法.这些类型是由编译器专门处理的,所以我无法完全模仿这种行为,但我希望至少可以创建具有相同结果的类似规则 - 如果它已经转义了它的方法,则禁止访问该对象创建.

请注意,我无法使用StackFrame和比较方法,因为对象可能会转义并返回相同的方法.

.net c#

4
推荐指数
1
解决办法
78
查看次数

比较i4o与PLINQ对比较大的系列

对于有i4o或PLINQ经验的人,我有一个问题.我有一个需要查询的大对象集合(大约400K).逻辑非常简单明了.例如,有Person对象的集合,我需要找到具有相同的名字,姓氏,datebirth,或名字/姓氏的首字母等相匹配的人它只是使用LINQ to对象耗时的过程.

我想知道i4o (http://www.codeplex.com/i4o)

或PLINQ可以帮助提高查询性能.哪一个更好?如果那里有任何方法.

谢谢!

c# linq linq-to-objects plinq

3
推荐指数
1
解决办法
1102
查看次数

.NET 2.0/C#中泛型方法的元数据的签名格式是什么?

例如,out在C#中使用关键字的方法中的参数将显示在元数据签名中,前面带有&符号&.我正在尝试为通用方法创建签名,但我不想使用元数据API来解决这个问题,当然它已在某处记录了吗?

这是我在Socket类上对BeginReceiveFrom的意思的一个例子:

        System.IAsyncResult([]System.Byte,System.Int32,System.Int32,
    System.Net.Sockets.SocketFlags,&System.Net.EndPoint,
System.AsyncCallback,System.Object)
Run Code Online (Sandbox Code Playgroud)

.net c# clr cil

3
推荐指数
1
解决办法
624
查看次数

调用可变参数方法

如何使用反射调用可变参数方法?像这个:

public static void ArgsMethod(__arglist)
{
    ArgIterator ai = new ArgIterator(__arglist);
    while(ai.GetRemainingCount() > 0)
    {
        Console.WriteLine(TypedReference.ToObject(ai.GetNextArg()));
    }
}
Run Code Online (Sandbox Code Playgroud)

typeof(Program).GetMethod("ArgsMethod").Invoke(null,new object[0])抛出NotSupportedException

.net c# reflection variadic-functions

3
推荐指数
1
解决办法
895
查看次数

在方法中使用Nullable Type会产生错误

我在一个可以为空的整数的类中创建了一个属性:

private int? submittedAge {get; set;}
Run Code Online (Sandbox Code Playgroud)

我这样做是因为用户可能会或可能不会进入年龄.稍后在应用程序中我在使用此属性之前进行检查,如果它是非null,我将它传递给需要整数的方法.

if (this.submittedAge != null)
{
  result = utilityClass.GetPeopleWithMatchingAge(this.submittedAge);
}
Run Code Online (Sandbox Code Playgroud)

Intellisense给出了一个错误,说方法调用有一些无效的参数.

如果我将submittedAge属性更改回非Nullable整数,那么一切都很好.

也许我不理解可空类型的正确使用.

c# nullable

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

什么是C++/CLI?

是否有任何要求您使用C++/CLI的任务,并且无法在托管代码中完成(使用P/Invoke和Marshal类),性能除外?

.net c++-cli

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

隐式委托投射

我想知道是否有一些方法可以将方法组,匿名方法或lambda表达式转换为System.Delegate而不知道确切的委托类型,如

var d = ()=>{};
dynamic d = ()=>{};
Delegate d = ()=>{};
Run Code Online (Sandbox Code Playgroud)

我需要一种方法,适用于任何带有任何参数和返回类型的方法,而不使用反射.谢谢你的回答.

c# delegates casting dynamic

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

从IntPtr句柄输入

是否可以System.TypeIntPtr类型句柄中获取对象(可以通过获取)?Type.TypeHandle.Value

例:

TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true
Run Code Online (Sandbox Code Playgroud)

编辑:我很高兴有许多有用的人认为我正在尝试解决其他问题,但我正在寻找这个特定问题的答案,我对此非常肯定.我很抱歉没有首先说明它.

编辑#2:类型句柄是一个指针,指向CLR中表示RTTI的结构.我不想从这个结构中读取数据,我想要一种为此返回托管Type对象的方法.我需要将指针"转换"为对象.

.net c# clr

0
推荐指数
1
解决办法
1562
查看次数

为什么在 Lua 中的 print() 表现得像这样?

关于 Lua 解释器

>print("This is a string
>>spread over multiline")
stdin:1: unfinished string near '"This is a'
Run Code Online (Sandbox Code Playgroud)

因为我们知道在 Lua 解释器上我们可以通过多行完成一个语句例如

>a=2
>a=a+
>>1
Run Code Online (Sandbox Code Playgroud)

这完美地工作

再次:

>print([[This is a multiline
>>string]])
This is a multiline
string
Run Code Online (Sandbox Code Playgroud)

这工作正常!!那么为什么在第一个 print() 语句中显示错误呢??

lua

0
推荐指数
1
解决办法
333
查看次数