我有一个类,为了做到这一点,工作需要设置8个不同的属性值.我想确保在尝试执行方法之前设置了所有8个属性.我目前已经传入了所有参数并通过构造函数进行设置.有一个更好的方法吗?
我需要能够从远程计算机列表中读取特定注册表项中的值.我可以使用以下代码在本地执行此操作
using Microsoft.Win32;
RegistryKey rkey = Registry.LocalMachine;
RegistryKey rkeySoftware=rkey.OpenSubKey("Software");
RegistryKey rkeyVendor = rkeySoftware.OpenSubKey("VendorName");
RegistryKey rkeyVersions = rkeyVendor.OpenSubKey("Versions");
String[] ValueNames = rkeyVersions.GetValueNames();
foreach (string name in ValueNames)
{
MessageBox.Show(name + ": " + rkeyVersions.GetValue(name).ToString());
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何获得远程计算机的相同信息.我甚至使用正确的方法还是应该查看WMI或其他什么?
有没有办法自动检查现有的C#源代码,以查找未正确处理的对象实例,即.使用try/catch/finally或使用语句?或者我需要手动查看代码?
我有一个业务层,它将Conn字符串和SQLCommand传递给数据层,就像这样
public void PopulateLocalData()
{
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "usp_PopulateServiceSurveyLocal";
DataLayer.DataProvider.ExecSQL(ConnString, cmd);
}
Run Code Online (Sandbox Code Playgroud)
然后DataLayer就像这样执行sql
public static int ExecSQL(string sqlConnString, System.Data.SqlClient.SqlCommand cmd)
{
int rowsAffected;
using (SqlConnection conn = new SqlConnection(sqlConnString))
{
conn.Open();
cmd.Connection = conn;
rowsAffected = cmd.ExecuteNonQuery();
cmd.Dispose();
}
return rowsAffected;
}
Run Code Online (Sandbox Code Playgroud)
我可以将SQLCommand作为这样的参数传递,还是有更好的接受方式.我担心的一个问题是,如果在执行查询时发生错误,cmd.dispose行将永远不会执行.这是否意味着它会继续耗尽永远不会释放的内存?
更新:
根据Eric的建议,我更明确地划分了业务层和数据层,因此业务层中的方法看起来像这样
public void PopulateLocalData()
{
DataLayer Data = new DataLayer(this.ConnString);
Data.UpdateLocalData();
}
Run Code Online (Sandbox Code Playgroud)
和DataLayer中调用的方法如下所示.
public void UpdateLocalData()
{
using (SqlConnection conn = new SqlConnection(this.ConnString))
using(SqlCommand cmd = new SqlCommand())
{ …Run Code Online (Sandbox Code Playgroud) 我试图在运行时简单地加载一个用C#编写的dll,并在该dll中创建一个类的实例.
Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll");
Type type = a.GetType("FileReleaseHandler", true);
TestInterface.INeeedHelp handler = Activator.CreateInstance(type) as TestInterface.INeeedHelp;
Run Code Online (Sandbox Code Playgroud)
不会抛出任何错误,如果我单步执行代码,我可以通过FileReleaseHandler类来执行构造函数,但处理程序的值始终为null.
我在这里错过了什么?或者甚至是否有更好的方法来解决这个问题?
我的目标是能够在应用程序之间共享配置设置.例如,我希望能够使用WinForm应用程序来设置和保存设置,并让控制台应用程序能够读取这些设置并作为计划任务运行.我尝试的方法是创建一个由Winform应用程序和控制台应用程序引用的SharedSettings类.在这个类中,只有像这样的公共字符串属性.
public class SharedSettings
{
public string URL { get; set; }
public string DestUser { get; set; }
public string RelScript { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我使用以下序列来序列化SharedSettings类的实例
SharedSettings settings = new SharedSettings();
settings.RelScript = this.txtRelScript.Text;
settings.URL = this.txtURL.Text;
settings.DestUser = this.txtDestUser.Text;
XmlSerializer dehydrator = new XmlSerializer(settings.GetType());
System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate);
dehydrator.Serialize(fs, settings);
Run Code Online (Sandbox Code Playgroud)
并将其反序列化并填充表单中的字段
SharedSettings settings = new SharedSettings();
XmlSerializer dehydrator = new XmlSerializer(settings.GetType());
System.IO.FileStream fs = new FileStream(this.configFile, FileMode.Open);
settings = (SharedSettings)dehydrator.Deserialize(fs);
this.txtRelScript.Text = settings.RelScript;
this.txtURL.Text = …Run Code Online (Sandbox Code Playgroud) 如果我有这样的嵌套对象的代码,我是否需要使用嵌套的using语句来确保SQLCommand和SQLConnection对象都正确处理,如下所示,或者如果实例化SQLCommand的代码在外部使用声明.
using (var conn = new SqlConnection(sqlConnString))
{
using (var cmd = new SqlCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = cmdTextHere;
conn.Open();
cmd.Connection = conn;
rowsAffected = cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud) 我希望能够 从 Sysinternals 但使用 C#检索本地机器的 SID,如PSGetSID实用程序。这可能吗?
编辑:我正在寻找一种适用于可能是域成员也可能不是域成员的计算机的解决方案。
我希望在Windows Server 2008服务器上运行Windows服务,该服务器将监视本地服务器上的目录(即C:\ Watch),并在该目录中创建新的pdf时,将该文件复制到网络共享(即.//192.168.1.2/Share).
这两个服务器都不是域的成员.
Windows服务将其登录设置为本地用户帐户,该帐户可以访问// server/share并创建和删除文件.
如果sourceDir和destDir是C:\ Source和C:\ Dest之类的本地文件夹但是如果我将destDir更改为网络位置,如// server/share /或//// server /,我有以下工作正常/ share //我收到错误"T文件名,目录名或卷标语法不正确".
更新: 我不再收到上面的错误,现在当我将sourceDir设置为C:\ Watch并将destDir设置为\ server\share \时(服务器可以是Windows或Ubuntu服务器,我得到一个System.UnauthorizedAccess我假设的错误来自目标服务器.如何设置连接到目标服务器时使用的凭据.请记住,服务器不在域中,可以是Windows或Ubuntu.
public partial class Service1 : ServiceBase
{
private FileSystemWatcher watcher;
private string sourceFolder;
private string destFolder;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
this.sourceFolder = Properties.Settings.Default.sourceDir;
this.destFolder = Properties.Settings.Default.destDir;
watcher = new FileSystemWatcher();
watcher.Path = this.sourceFolder;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.pdf";
watcher.Created += new FileSystemEventHandler(watcher_Created);
watcher.EnableRaisingEvents = true; …Run Code Online (Sandbox Code Playgroud) 我目前正在动态创建一个位图,并使用位图中的图形对象在其上绘制一个字符串,如下所示:
System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
graph.DrawString(text, font, brush, new System.Drawing.Point(0, 0));
Run Code Online (Sandbox Code Playgroud)
这将返回一个矩形位图,其中字符串从左到右直接写入.我也希望能够画出彩虹形状的弦乐.我怎样才能做到这一点?