管理员权限打开VisualStudio无法访问网络磁盘的解决办法

【问题产生】

问题最初是在administrator权限下,visual studio 打开网络磁盘下的文件报错。经过几次调试,最终发现是问题是在管理员权限下,vs无法访问网络磁盘。

Console.Write( System.IO.File.Exists(path));

该结果返回False。为了确认是由于权限问题引起,使用非管理员权限打开vs,运行上面的程序,结果返回True。

至此问题确立:win7/win8下,使用管理员权限打开VisualStudio,无法访问网络磁盘。

阅读更多

C#调用C DLL参数问题

首先回顾一下API和C#参数类型的基本对应关系:

需要注意的是这个对应关系是传入参数的对应关系,如果是输出参数,LPSTR和LPCSTR(也就是C/C++里面的char*),对应的就要是StringBuider。

例如:int TEST(char* result)

其中result是输出参数,那么在c#中,就应该使用 int TEST(StringBuider result),而不是ref string,否则会报内存错误。

阅读更多

WPF中ListView使用GridViewColumn居中对齐的方法

在WPF中使用ListView经常会用到GridView作为视图,但是却碰到GridViewColumn不能居中对齐的问题,首先想到不使用GridViewColumn的DisplayMemberBinding属性,直接设置DataTemplate,于是尝试修改代码为:

1
2
3
4
5
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock TextAlignment="Center" Text="{Binding XX}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>

结果还是不行,因为TextBlock的Width是根据Text内容自动调整,没有填充整个单元格,所以需要调整填充样式。方法有两种:

【方案一】

将DataTemplate元素的MinWidth和单元格的ActualWidth绑定,这样就能让DataTemplate元素始终填满单元格:

阅读更多

WCF报错System.BadImageFormatException的解决方案

在一个WCF Service Library中,如果引用了一些32bit的dll,我们称这个WCF Service Library依赖于x86。在调试过程中,也必须将其工程编译属性调整为x86。但如果我们的编译环境是64位,运行可能就会报错BadImageFormatException:

这是因为WCF Service Library是一个dll,必须放在容器中执行,在vs调试中使用了WcfSvcHost.exe来作为一个临时容器。它位于vs安装目录下的Common7\IDE\WcfSvcHost.exe。由于系统环境是64位,所以安装vs的时候就会自动设置WcfSvcHost.exe为64位,所以当WcfSvcHost.exe运行32位dll时才会报错。解决这个问题可以使用Corflags命令.

corflags命令的详细介绍可以参考这里。它可以将程序设置在32位下工作:

操作步骤:

阅读更多

WPF使用MediaElement方法介绍

在WPF或Silverlight中使用MediaElement控件可以方便的制作一个视频音频播放器。

首先制作一个UserControl:

代码如下:

1
2
3
4
5
6
7
8
9
10
11
<DockPanel Height="387">
<StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
<Button Height="23" HorizontalAlignment="Left" Margin="16,0,0,10" x:Name="btnPlay" VerticalAlignment="Bottom" Width="75" Click="btnPlay_Click">播放</Button>
<Button Height="23" HorizontalAlignment="Left" Margin="16,0,0,10" x:Name="btnPause" VerticalAlignment="Bottom" Width="75" Click="btnPause_Click">暂停</Button>
<Label Content="音量:"/>
<Slider x:Name="sldVolumn" Value="{Binding Volume, ElementName=mePlayer, Mode=TwoWay, UpdateSourceTrigger=Default}" Maximum="1" LargeChange="0.1" SmallChange="0.01" Width="124" />
<Label Content="进度:"/>
<Slider x:Name="sldProgress" Minimum="0" Value="{Binding ElementName=mePlayer, Path=Position, Mode=TwoWay, Converter={StaticResource PrgConverter}}" LargeChange="10" Width="192" />
</StackPanel>
<MediaElement DockPanel.Dock="Top" Margin="16,23,12,39" x:Name="mePlayer" LoadedBehavior="Manual" MediaOpened="mePlayer_MediaOpened" />
</DockPanel>
阅读更多

.Net程序间的通讯与控制

如果有一个需求,用一个程序控制另一个程序,最简单的,比如用程序A打开程序B,这个想必平时都会用到,可以使用Process类及相关的方法。那么在打开B的时候发送一些参数,然后B根据这些参数做出一些反映,这该怎么实现?其实还是用Process。

发送端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

static void Main(string[] args)
{
Console.WriteLine("请输入接收器路径:");
string path = Console.ReadLine();
Console.WriteLine("请输入接收器启动参数:");
string para = Console.ReadLine();
ProcessStartInfo pi = new ProcessStartInfo();
pi.FileName = @path;
pi.Arguments = para;

try
{
Process.Start(pi);
}
catch
{
Console.WriteLine("找不到接收器或出现错误!");
}
Console.ReadKey();
}

接收端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("未接到信息!");
}
else
{
foreach (string s in args)
{
Console.WriteLine(s);
}
}

Console.ReadKey();
}
阅读更多

.Net委托详解

【什么是委托】

  • 委托是对函数的引用,它是一个引用类型,类似c/cpp中的函数指针。但它是类型安全的。
  • 委托是一个类,定义了方法的类型,可以将方法当做另一个方法的参数传递。

委托就是一个安全的函数指针,用来执行函数方法的东西。


【如何使用委托】

阅读更多

WCF基础知识与实例

一、 WCF是什么?

Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口。

二、 WCF是用来做什么的?

WCF就是用来通信的。它集合了多种平台,多种协议,多种方式收发客户和服务之间的消息。

例子:我们在windows下玩网络游戏,每一个操作都会通过网络传给服务器,服务器可能是windows也可能是Unix,它接收到这个操作命令,处理后反馈给我们。接收,处理,反馈,这中间的部分就是WCF的用途。

阅读更多

常用C#设计模式(下)

【代理模式】

描述:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。举几个例子,用户提供食材和菜名,“不想”自己做菜,给厨师,厨师就是一个代理。国内用户访问facebook会被墙,代理可以绕开GFW并将请求结果返回。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public interface IRequest
{
// Methods
string Request(string sourceIp,string targetIp);
}

class GFW : IRequest
{
public string Request(string sourceIp, string targetIp)
{
if (sourceIp=="国内ip" && targetIp == "敏感ip")
{
return "404错误";
}
else
{
return "请求成功";
}
}
}

class Proxy : IRequest
{
GFW gfw = new GFW();

public string Request(string sourceIp, string targetIp)
{
sourceIp = "代理ip";
return gfw.Request(sourceIp, targetIp);
}
}

//调用
GFW gfw = new GFW();
Console.Write(gfw.Request("国内ip", "敏感ip"));

//Proxy p = new Proxy();
//Console.Write(p.Request("国内ip", "敏感ip"));
阅读更多

常用C#设计模式(中)

【装饰模式】

描述:动态地给一个对象添加一些额外的职责。

有些时候我们需要给某个对象增加一些新的特性,使用继承机制是一种有效的方法,但是不够灵活。因为如果我们要使用继承扩展一个类,就必须要在编译的时候定义这个扩展的类,这是所谓的静态,也是强类型语言的特点。这时候可以使用装饰模式。

例子:

Weapon类

阅读更多