小编Lee*_*ere的帖子

如果GetFields()不保证顺序,LayoutKind.Sequential如何工作

我需要在声明顺序的保证顺序中获取fieldinfo.现在我正在使用属性来指定顺序.

有更自动的方式吗?

有没有人知道如何LayoutKind.Sequential工作,如果我可以应用它的技术.

LayoutKind.Sequential除非有一些添加属性的预编译器代码,否则我看不出它是如何工作的.

c# reflection marshalling

21
推荐指数
2
解决办法
3136
查看次数

C++/CLI枚举没有在C#中显示,参考C++/CLI项目

我无法获得C++/CLI枚举的内容以显示在C#项目中.

我可以看到我写的一个类,甚至看到枚举,但我看不到枚举值.所以我不能在C#端使用这个东西.

无法显示C++/CLI枚举内容的任何原因.

我的C++/CLI项目被编译为混合以重用C++库.

我正在使用Visual Studio 2005.

c# enums c++-cli visual-studio

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

通过覆盖GetHashCode和Equals从IEqualityComparer <>派生外部类的优点

我需要对成员变量而不是类进行散列,所以我不检查引用是否在字典中.如果没有覆盖默认值,它将找不到相同的Value,但只有在找到相同的确切实例时才返回HashedType,这样代码就会失败.

Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Run Code Online (Sandbox Code Playgroud)

HashedType的定义:

HashedType
{
   public HashedType(Int32 value) { Value = value); }
   public HashedType(String value) { Value = value); }
   public object Value;
   public void Serialize(Serializer s)
   {
      if (Value.GetType() == typeof(Int32)) 
      {
         s.Set<Int32>(0);
         s.Set<Int32>(Value);
      }
      else 
      {
         s.Set<Int32>(1);
         s.Set<String>(Value);
      }

   }
}
Run Code Online (Sandbox Code Playgroud)

看起来我可以覆盖GetHashCode()和Equals()为我这样做.

但是,MSDN建议我创建一个单独的类,我从IEqualityComparer派生并实例化我的字典使用HashedType和HashedTypeComparer:IEqualityComparer.

为了使这更容易,我从Dictionary中派生并创建

HashedTypeDictionary<U> : Dictionary<T,U> 
{ 
   public HashedTypeDictionary() : base(new  HashedTypeComparer()) { } 
   public bool Equals(HashedType a, HashedType b) { return a.Value == …
Run Code Online (Sandbox Code Playgroud)

c# hash dictionary

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

隐藏C#'使用参数的实现

我正在尝试从与本机代码共享的数据的结构(实际上是类,因此它的引用类型)中抽象编组IntPtr.

我有这个助手类:

class NativeStruct<StructType> : IDisposable
{
    public NativeStruct()
    {
        _DataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(StructType)));
        Marshal.PtrToStructure(_DataPtr, _Data);
    }
    public NativeStruct(IntPtr dataPtr)
    {
        _DataPtr = dataPtr;
        Marshal.PtrToStructure(_DataPtr, _Data);
    }

    void IDisposable.Dispose()
    {
        Marshal.StructureToPtr(_Data, _DataPtr, true);
    }

    public StructType Data { get { return _Data; } }

    IntPtr _DataPtr;
    public StructType _Data;
}
Run Code Online (Sandbox Code Playgroud)

无论如何都有隐含的代码:

using (Shared_s data = new Toolbox.NativeStruct<DataStruct>(myIntPtr).Data)
{
    data.someMember = someValue;
}
Run Code Online (Sandbox Code Playgroud)

一些方法来改变它

EditStruct(DataStruct, myIntPtr)
{
    data.someMember = someValue;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,我会使用像

#define EditStruct(StructType, IntPtr) using  \
(Shared_s data = new Toolbox.NativeStruct<StructType>(IntPtr).data)
Run Code Online (Sandbox Code Playgroud)

c# using-statement

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

具有不同数据类型的函数调用

这个程序的第7行不是"pay = prt(pay);" 应该抛出编译或运行时错误,因为它将int传递给需要double的param?我用dev-c ++编译好了,用两行输出运行程序.请解释一下,谢谢.

#include <stdio.h>
int prt(double b);
main ()
{
    int pay = 3;
    double tax = 2.2;
    pay = prt(pay);
    prt(tax);
}     

int prt(double b)
{
    b *= 2;
    printf("%.2lf\n", b);   
}
Run Code Online (Sandbox Code Playgroud)

c types function-calls

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

通过SendMessage将C#中的字符串发送到MFC

我知道如何通过使用LPCTSTR代替PInvoke想要CString的方法,并设置DllImport以使用LPstr转换进行调用.

但是,如何使用SendMessage,LPARAM是IntPtr?

这会有用吗?

    [DllImport("user32.dll", CharSet = CharSet.Ansi)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, 
        [MarshalAs(UnmanagedType.LPStr)] String lParam);
Run Code Online (Sandbox Code Playgroud)

c# pinvoke mfc

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