这是情况,我在我的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 之前设置它?
我已经与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) 我有以下代码使用预先计算的内存表进行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) 大多数现代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) 使用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 Server 2008 R2
谢谢
吉拉德.
为了提高我从相机中获得的图像质量,我开始挖掘替代的去马赛克技术.我发现有很多不同的算法,但大多数都可追溯到2000年.十多年过去了,我想知道最新的技术是什么?
算法或源代码将受到高度赞赏.
我有一个外部方法接收一些参数,分配内存并返回一个指针.
[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)]
public static extern IntPtr cvCreateHeader(
Size size,
int a,
int b);
Run Code Online (Sandbox Code Playgroud)
我很清楚在托管应用程序中分配非托管内存是不好的做法,但在这种情况下我没有选择,因为dll是第三方.
有一个等效的函数释放内存,我知道分配的数组的大小是多少.
我正在尝试新的System.Threading.Parallel方法,如parallel for和foreach.
它们似乎工作得很好,但我需要一种方法来增加执行的并发线程数,这些线程是8(我有一个四核).
我知道有一种方法我可以找到你隐藏该死的财产的地方.
吉拉德.
这应该很简单,但我想我错过了一些东西.
我有一个简单的用户控件包含一个网格和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)
谢谢你的帮助.
我正在编写一个程序,在多个线程中调用多个基于C的函数(p/Invoke).
程序有时会因访问冲突错误而崩溃.我的第一个想法是GC优化了内存,并将C函数正在处理的内存块移动到另一个位置.
我想做的是让GC工作,但禁用它移动(defrags)内存的部分.
有没有办法做到这一点?
c# ×6
image ×2
optimization ×2
performance ×2
pinvoke ×2
sql ×2
sql-server ×2
.net ×1
.net-4.0 ×1
32bit-64bit ×1
algorithm ×1
dllimport ×1
emgucv ×1
opencv ×1
path ×1
silverlight ×1
xaml ×1