小编Gil*_*lad的帖子

在C#DllImport中使用32位或64位dll

这是情况,我在我的dot.net应用程序中使用基于C的dll.有2个dll,一个是32位称为MyDll32.dll,另一个是64位版本,名为MyDll64.dll.

有一个保存DLL文件名的静态变量:string DLL_FILE_NAME.

它以下列方式使用:

[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);
Run Code Online (Sandbox Code Playgroud)

到目前为止简单.

可以想象,该软件是在打开"Any CPU"的情况下编译的.

我还有以下代码来确定系统是否应该使用64位文件或32位文件.

#if WIN64
        public const string DLL_FILE_NAME = "MyDll64.dll";
#else
        public const string DLL_FILE_NAME = "MyDll32.dll";        
#endif
Run Code Online (Sandbox Code Playgroud)

到目前为止,您应该看到问题.. DLL_FILE_NAME是在编译时定义的,而不是在执行时间中定义的,因此根据执行上下文不会加载右dll.

处理这个问题的正确方法是什么?我不想要两个执行文件(一个用于32位,另一个用于64位)?如何在DllImport语句中使用DLL_FILE_NAME 之前设置它?

.net c# pinvoke dllimport 32bit-64bit

59
推荐指数
4
解决办法
5万
查看次数

访问违规例外之谜

我已经与EMGU + OpenCV合作了很长一段时间并遇到了这个AccessViolationException谜.

首先,代码:

class AVE_Simulation
    {
        public static int Width = 7500;
        public static int Height = 7500;
        public static Emgu.CV.Image<Rgb, float>[] Images;

        static void Main(string[] args)
        {
            int N = 50;
            int Threads = 5;

            Images = new Emgu.CV.Image<Rgb, float>[N];
            Console.WriteLine("Start");

            ParallelOptions po = new ParallelOptions();
            po.MaxDegreeOfParallelism = Threads;
            System.Threading.Tasks.Parallel.For(0, N, po, new Action<int>((i) =>
            {
                Images[i] = GetRandomImage();
                Console.WriteLine("Prossing image: " + i);
                Images[i].SmoothBilatral(15, 50, 50);
                GC.Collect();
            }));
            Console.WriteLine("End");
        }

        public static Emgu.CV.Image<Rgb, float> GetRandomImage() …
Run Code Online (Sandbox Code Playgroud)

c# opencv emgucv

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

使用预先计算的平移阵列的快速Sin/Cos

我有以下代码使用预先计算的内存表进行Sin/Cos函数.在下面的示例中,该表具有1024*128项,涵盖从0到2pi的所有Sin/Cos值.我知道我可以使用Sin/Cos对称并只保留1/4的值,但是在计算值时我会有更多'ifs'.

private const double PI2 = Math.PI * 2.0; 
private const int TABLE_SIZE = 1024 * 128;
private const double TABLE_SIZE_D = (double)TABLE_SIZE;
private const double FACTOR = TABLE_SIZE_D / PI2;

private static double[] _CosineDoubleTable;
private static double[] _SineDoubleTable;
Run Code Online (Sandbox Code Playgroud)

设置转换表

private static void InitializeTrigonometricTables(){
   _CosineDoubleTable = new double[TABLE_SIZE];
   _SineDoubleTable = new double[TABLE_SIZE];

   for (int i = 0; i < TABLE_SIZE; i++){
      double Angle = ((double)i / TABLE_SIZE_D) * PI2;
      _SineDoubleTable[i] = Math.Sin(Angle);
      _CosineDoubleTable[i] = Math.Cos(Angle);
   }
}
Run Code Online (Sandbox Code Playgroud)

价值是弧度的两倍.

Value %= …
Run Code Online (Sandbox Code Playgroud)

c# optimization performance

15
推荐指数
2
解决办法
8575
查看次数

将12bit图像转换为16bit图像的最快方法

大多数现代CMOS相机都可以产生12bit的Bayered图像.将12bit的图像数据阵列转换为16bit 的最快方法是什么,这样才能进行处理?实际问题是用4个零填充每个12位数,可以假设小端,SSE2/SSE3/SS4也可以接受.

代码添加:

int* imagePtr = (int*)Image.data;
fixed (float* imageData = img.Data)
{
   float* imagePointer = imageData;
   for (int t = 0; t < total; t++)
      {
         int i1 = *imagePtr;
         imagePtr = (int*)((ushort*)imagePtr + 1);
         int i2 = *imagePtr;
         imagePtr = (int*)((ushort*)imagePtr + 2);
         *imagePointer = (float)(((i1 << 4) & 0x00000FF0) | ((i1 >> 8) & 0x0000000F));
         imagePointer++;
         *imagePointer = (float)((i1 >> 12) & 0x00000FFF);
         imagePointer++;
         *imagePointer = (float)(((i2 >> 4) & 0x00000FF0) | ((i2 >> 12) …
Run Code Online (Sandbox Code Playgroud)

optimization performance image image-processing

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

从Image到Varbinary(最大)

使用SQL 2005

我有一个5列的表

ID - int 
Param - smallint 
Data1 - image 
Data2 - image
Data3 - image
Run Code Online (Sandbox Code Playgroud)

图像大小可以只有20个字节,可以大到1MB(是的,超过8k).图像的大小不是恒定的,因为它保存压缩数据.BLOB的大部分日期约为512B至1.5kB.Data1,Data2和Data3之间存在逻辑关系,这是它们存储在一起的原因.在拥有3年历史数据的数据库中,有6600 条记录.

努力改进数据存储并使系统为未来的SQL版本做好准备.我想将图像列更改为varbinary(MAX)数据类型.FILESTREAM将是另一种可能性,但我不确定持有约2亿个文件会更有效.

在将图像更改为varbinary(max)之后,我注意到表的整体大小已缩小(只是一点点),但每次添加/删除数据时,完成该过程所需的时间要长得多.

根据我的理解,如果varbinary(max)值小于8k,它将被放置在表内,而如果它大于8k则将其放在其他地方,并且指向该数据的指针存储在表中.使用图像时,即使图像数据小于8k,也会存储指针.

通常,每天添加和删除20000条记录,因此没有太多的数据添加/删除,单个选择通常在10-200个连续记录中.

有没有办法设置varbinary(max)数据总是(无论大小)存储在表外,与存储图像的方式相同?

sql sql-server sql-server-2005

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

SQL Server单个查询内存使用情况

我想找出或至少估计单个查询(特定查询)在执行时会占用多少内存.在此处发布查询没有意义,因为我想在多个查询上执行此操作,并查看是否对不同的数据库进行了更改.有什么方法可以获得这些信息吗?

使用SQL Server 2008 R2

谢谢

吉拉德.

sql sql-server sql-server-2008

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

什么是最新的DeBayer/Demosaicing技术

为了提高我从相机中获得的图像质量,我开始挖掘替代的去马赛克技术.我发现有很多不同的算法,但大多数都可追溯到2000年.十多年过去了,我想知道最新的技术是什么?

算法或源代码将受到高度赞赏.

algorithm image image-processing

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

如何固定'非托管'指针?

我有一个外部方法接收一些参数,分配内存并返回一个指针.

[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)]
public static extern IntPtr cvCreateHeader(
       Size size,
       int a,
       int b);
Run Code Online (Sandbox Code Playgroud)

我很清楚在托管应用程序中分配非托管内存是不好的做法,但在这种情况下我没有选择,因为dll是第三方.

有一个等效的函数释放内存,我知道分配的数组的大小是多少.

  1. 如何固定返回的指针,以便GC不移动它(不会不安全)?'fixed'不会这样做,因为这个指针在整个班级中被广泛使用?
  2. 这个p/Invoke有更好的方法吗?

c# pinvoke

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

如何使用System.Threading.Parallel(.Net 4.0)增加并发并行任务

我正在尝试新的System.Threading.Parallel方法,如parallel for和foreach.

它们似乎工作得很好,但我需要一种方法来增加执行的并发线程数,这些线程是8(我有一个四核).

我知道有一种方法我可以找到你隐藏该死的财产的地方.

吉拉德.

c# parallel-processing multithreading .net-4.0

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

WPF:相对拉伸多个路径

这应该很简单,但我想我错过了一些东西.

我有一个简单的用户控件包含一个网格和2个路径.

我想让这个用户控件可伸缩到任何所需的大小,保持相同的路径相对位置(原始工作有更多的路径与动画).

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="test.MainPage">
    <Grid x:Name="LayoutRoot" Background="White" Width="400" Height="400">
        <Path Fill="White" Stretch="Fill" Stroke="Black" Height="101"
              Margin="49.5,49.5,199.5,0" VerticalAlignment="Top"
              Data="M50,50 L100,50 L150,50 L200,50 L200,100 L150,100 L150,150 L100,150 L100,100 L50,100 z"/>
        <Path Fill="White" Stretch="Fill" Stroke="Black"
              Margin="0,150.5,48.5,148.5"
              Data="M50,50 L100,50 L150,50 L200,50 L200,100 L150,100 L150,150 L100,150 L100,100 L50,100 z"
              HorizontalAlignment="Right" Width="151"/>
    </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

silverlight xaml path

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

抑制GC内存优化

我正在编写一个程序,在多个线程中调用多个基于C的函数(p/Invoke).

程序有时会因访问冲突错误而崩溃.我的第一个想法是GC优化了内存,并将C函数正在处理的内存块移动到另一个位置.

我想做的是让GC工作,但禁用它移动(defrags)内存的部分.

有没有办法做到这一点?

c# garbage-collection defragmentation

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