小编DxC*_*xCK的帖子

在传递给非托管代码之前固定updateble结构?

我使用一些旧的API,需要将结构的指针传递给异步运行的非托管代码.

换句话说,在我将struct指针传递给非托管代码之后,非托管代码会复制指针并立即返回.非托管代码可以在后台访问该结构,在另一个线程中.我无法控制在另一个线程和线程本身中运行的非托管代码.

fixed {}语句不能用于固定,因为它不是为异步非托管固定而设计的.

GCHandle只能引用引用,因此必须将结构框设置为使用GCHandle.我尝试过,它的确有效.它的主要问题是您无法从托管代码更新结构.要更新结构,首先我们需要将其取消装箱,然后更新,然后再次装箱,但是......哎呀......再次装箱?!?这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码...不适用于我的案件.

如何在没有固定{}语句的情况下在内存中固定结构,以便我可以不更改指针的情况下从托管代码更新它?

谢谢.

编辑:

只是想...有没有办法固定包含结构的父对象,然后获取结构的指针而不是容器对象?

.net c# struct unmanaged pinning

10
推荐指数
2
解决办法
4851
查看次数

可变数量的参数没有装箱值类型?

public void DoSomething(params object[] args)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

上述签名的问题是,将传递给该方法的每个值类型都将被隐式装箱,这对我来说是严重的性能问题.

有没有办法去掉一个方法,接受可变数量的参数而不装箱值类型?

谢谢.

.net c# performance boxing value-type

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

在DWM玻璃下使用TextBox进行测试

我正在尝试在DWM Glass下处理TextBox文本的颜色.我读了很多材料,仍然没有完美的解决方案.

我在这里找到了几乎完美的结果代码:http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/,但它有很多轻弹和特定于事件的操作(例如:键入一些文本并按"主页"按钮).

我试图解决这些问题.

以下代码是原始代码的变体,但它不依赖于任何事件,只是WM_PAINT.它仍然轻弹,插入符号(文本光标)以某种方式消失了!

如何防止闪烁,以及如何获取插入符号(文本光标)?

谢谢.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;

namespace AeroWindowsFormsApplication
{
    public class AeroTextBox : TextBox
    {
        private const int WM_PAINT = 0xf;

        private bool _aeroFix;

        public AeroTextBox()
        {
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        }

        protected override void WndProc(ref Message m)
        {
            if (_aeroFix)
            {
                switch (m.Msg)
                {
                    case WM_PAINT:
                        RedrawAsBitmap();
                        m.Result = new IntPtr(1);
                        break;

                    default:
                        base.WndProc(ref m);
                        break;
                }
            }
            else
            { …
Run Code Online (Sandbox Code Playgroud)

.net c# textbox dwm

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

使用完全相同的代码合并catch块?

我想合并以下代码中的catch块,以实现代码重用:

try
{
    DoSomeInputOutput();
}
catch (InvalidOperationException ex)
{
    HandleKnownException1(ex);
}
catch (InvalidDataException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentNullException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
{
    HandleKnownException2(ex);
}
catch (ArithmeticException ex)
{
    HandleKnownException2(ex);
}
catch (InvalidCastException ex)
{
    HandleKnownException2(ex);
}
catch (Exception ex)
{
    HandleUnknownException(ex);
}
Run Code Online (Sandbox Code Playgroud)

这样的事情:

try
{
    DoSomeInputOutput();
}
catch (InvalidOperationException ex)
catch (InvalidDataException ex)
catch (ArgumentNullException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
catch (ArithmeticException ex)
catch (InvalidCastException ex)
{
    HandleKnownException2(ex);
}
catch (Exception ex)
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# code-reuse exception-handling try-catch

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

WCF NetTcpBinding缓冲与流式处理性能问题

我编写了一个WCF服务,它应该使用Streamed TransferMode NetTcpBindingSystem.IO.Streamobject 来转换任意大小的文件.

在运行性能测试时,我发现了显着的性能问题.然后我决定使用Buffered TransferMode进行测试,看到性能提高了两倍!

因为我的服务应该传输大文件,所以我不能留在Buffered TransferMode,因为服务器和客户端的大文件的内存管理开销在一起.

为什么Streamed TransferMode比Buffered TransferMode慢?我该怎么做才能让Stremed表现更好?

.net c# streaming performance wcf

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

获取Type中使用的程序集路径

我需要一个方法,它接受一个Type并返回该类型中使用的所有程序集的路径.我写了这个:

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type)
{   
 yield return type.Assembly.Location;

 foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())
 {
  yield return Assembly.Load(assemblyName).Location;
 }
}
Run Code Online (Sandbox Code Playgroud)

通常这种方法可以完成这项工作,但也有一些缺点:

  • 我没有找到如何从类型本身获取引用的程序集/类型,所以我使用了type.Assembly.GetReferencedAssemblies()并获得了整个程序集的引用,而不仅仅是那些与类型相关的引用.

  • type.Assembly.GetReferencedAssemblies()返回AssemblyName,没有location/path/filepath属性.要获取location属性,我首先使用Assembly.Load()然后使用location属性.我不希望加载程序集获取它们的路径,因为它们没有必要使用,并且因为Assembly.Load()可能因FileNotFoundException或BadImageFormatException而失败.

.net c# reflection assemblies reference

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

Marshal.PtrToStringUni()vs new String()?

假设我有一个char*类型的指针到unicode字符串,我知道长度:

char* _unmanagedStr;
int _unmanagedStrLength;
Run Code Online (Sandbox Code Playgroud)

我有2种方法将其转换为.NET字符串:

Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);
Run Code Online (Sandbox Code Playgroud)

new string(_unmanagedStr, 0, _unmanagedStrLength);
Run Code Online (Sandbox Code Playgroud)

在我的测试中,两个调用都给出了完全相同的结果,但它new string()比1.8倍快Marshal.PtrToStringUni().

为什么这种性能差异?两者之间还有其他功能差异吗?

.net c# unsafe unmanaged marshalling

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

获取Control.KeyDown上的char?

处理Control.OnKeyPress事件时,有一个KeyPressEventArgs包含a KeyChar.

出于可用性原因,我需要完全相同KeyChar但处理OnKeyDown事件时.

KeyEventArgs不包含任何字符有关的数据.我的意思是,如果A按键有或没有Shift影响KeyCode,KeyData或者KeyValue.使用另一种语言时,我仍然可以获得资本英语价值.

如何获得KeyPressEventArgs.KeyChar内部KeyDown活动?

谢谢.

.net c# controls char keydown

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

从升级过程开始非升级过程

可能重复:
如何在Vista(.NET)中运行NOT raise
如何取消提升子进程的权限

我的程序作为一个提升的进程运行,并启动新的进程Process.Start().

出于安全原因,我希望将这些新进程作为非提升程序运行.

怎么做?

.net c# uac start-process elevated-privileges

7
推荐指数
0
解决办法
5049
查看次数

奇怪的表现行为

我正在使用Visual Studio 2010 SP1,目标框架是2.0,平台目标:任何CPU,在Windows 7 x64 SP1下进行测试.

我遇到了奇怪的表现行为.

如果没有app.config,或者使用以下app.config,它会让我的程序运行缓慢(秒表显示~0.11秒)

<?xml version="1.0"?>
<configuration>
  <startup >
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

以下app.config使我的程序运行速度提高了x5倍(秒表显示~0.02秒)

<?xml version="1.0"?>
<configuration>
  <startup >
    <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这是测试程序代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        while (true)
        {
            sw.Reset();
            sw.Start();

            for (int i = 0; i < 1000000; i++ )
            {
                "blablabla".IndexOf("ngrhotbegmhroes", StringComparison.OrdinalIgnoreCase);
            }

            Console.WriteLine(sw.Elapsed);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我坐了几个小时,无法弄清楚这里发生了什么.你知道吗?

.net c# string performance

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