我有一个已注册com interop的dll,所以在HKLM\Software\Classes\CLSID [my guid]\InprocServer32 [my version no]\Codebase下它有已注册dll的路径.但是,我重新安排了我的文件夹结构,以便路径不再正确.有没有办法取消注册该DLL而不将其重新注册,然后取消注册,然后再次删除该文件?
如果我不再拥有该dll,或者只有一个具有不同版本号的那个,该怎么办?
我正在.net 2.0中编写一个Windows服务.
我应该做内OnStart()如果由于某种原因,我不希望我的服务启动方法?我可以简单地调用Stop()基类(ServiceBase)的方法吗?我已经尝试过了,并且获得了一些有趣的内存访问异常.是否需要启动一个单独的线程来调用该Stop()方法?
在 Windows 服务中,我想检查存储在每个用户的 HKCU 注册表区域中的一些用户首选项。我怎样才能做到这一点?
我看到 HKEY_USERS 具有登录到机器的每个用户的子键(或类似的东西?),其中是每个用户的 HKCU 区域。但是,这些子项是用户的 SID,所以我需要计算出当前登录用户的 SID。
然后我会查询HKEY_USERS\<the users SID>\whichever\key\i\need来代替查询HKEY_CURRENT_USER\whichever\key\i\need。
从这个问题中,我可以以 DOMAIN\USER 格式获取机器上当前用户的列表。有没有办法从用户的 Windows 登录中获取用户的 SID?或者是否有更直接的方法来获取当前登录用户的 HKCU 注册表路径?
是否可以将datareader权限授予SQL Server数据库角色而不是用户?
我正在遵循此处提供的 pinvoke 代码,但对将可变长度数组编组为 size=1 然后通过计算偏移量而不是索引到数组来逐步执行它感到有点害怕。难道就没有更好的办法吗?如果不是,我应该如何做才能确保 32 位和 64 位安全?
[StructLayout(LayoutKind.Sequential)]
public struct SID_AND_ATTRIBUTES
{
public IntPtr Sid;
public uint Attributes;
}
[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_GROUPS
{
public int GroupCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public SID_AND_ATTRIBUTES[] Groups;
};
public void SomeMethod()
{
IntPtr tokenInformation;
// ...
string retVal = string.Empty;
TOKEN_GROUPS groups = (TOKEN_GROUPS)Marshal.PtrToStructure(tokenInformation, typeof(TOKEN_GROUPS));
int sidAndAttrSize = Marshal.SizeOf(new SID_AND_ATTRIBUTES());
for (int i = 0; i < groups.GroupCount; i++)
{
// *** Scary line here:
SID_AND_ATTRIBUTES sidAndAttributes = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure(
new …Run Code Online (Sandbox Code Playgroud) 我想生成一个序列化程序集或 .cs 文件来使用 XmlAttributeOverrides 序列化我的类型,然后直接在我的项目中引用这个程序集/.cs 文件而不是使用 XmlSerializer 来执行 xml 序列化/反序列化。这是因为序列化使用 XmlAttributeOverrides,并且当您创建具有覆盖的 XmlSerializer 时,它不会查找现有程序集,但会始终重新生成一个程序集(参考)。我的程序在无法运行 csc.exe 的环境中运行,因此我无法在运行时生成序列化程序集。
需要明确的是,我不能只使用 sgen.exe,因为它只会生成执行默认 xml 序列化/反序列化的程序集。如果您创建一个 XmlSerializer 并在构造函数中传递它 XmlAttributeOverrides则 Serialize() 和 Deserialize() 不使用由 sgen.exe 生成的程序集,因此 sgen.exe 对我来说似乎没有用。使用覆盖时 XmlSerializer 将始终生成新程序集。
那么,有没有一种方法可以调用 XmlSerializer 或其他类并让它创建一个可以包含在我的项目中的 .cs 文件或 dll?如果可能的话,我想自动化这个过程,这样我就不需要在更改正在序列化的类型时进行手动更改。我不能使用 sgen.exe /k 因为它只为一种类型生成默认的 XmlSerializer 而不是我需要的使用覆盖的类型。是否有另一种方法来生成或捕获由 XmlSerializer 创建的 .cs 文件?
SQL Server convert()函数可以将varbinary数据转换为具有以下编码的字符串:
每个二进制字符都转换为两个十六进制字符.如果转换表达式的长度大于data_type长度,则将被截断.
如果data_type是固定大小的字符类型,并且转换结果的长度小于data_type的长度; 空格被添加到转换表达式的右侧以保持偶数个十六进制数字.
字符0x将添加到样式1的转换结果的左侧.
例如,输出可能看起来像'0x389D7156C27AA70F15DD3105484A8461A2268284'.我怎样才能在C#中轻松做同样的事情?即使用相同类型的编码将byte []转换为字符串?
我有一个打包为MSI的产品.当我的客户在现有版本的顶部安装我的产品的新版本时,由于自定义VBS操作,它不能很好地工作,如下所述.我的问题是:如何更改我的MSI,以便安装在顶部将始终完全卸载任何现有版本?
细节是:
我在不同的公司部署了各种版本的产品.大约每年一次,我的每个客户都会收到我的产品的新版本并部署到他们公司的工作站.负责部署的人员宁愿他们可以在旧版本的顶部安装新版本,而不必在他们的安装包中包含卸载步骤.
msi安装会创建一些文件并将其写入[CommonApplicationData]\MyApp文件夹.在执行期间,应用程序在[CommonApplicationData]\MyApp文件夹中创建更多文件.在卸载期间,我需要删除所有这些文件.由于msi没有安装它们,因此它们不会自动卸载,因此我创建了一个vbs脚本来删除该文件夹及其中的任何其他内容.我在ExecuteDeferred中输入命令来执行该vbs:
...
RemoveFiles
RemoveFolders
CreateFolders
MoveFiles
InstallFiles
PatchFiles
If REMOVE="ALL" Then
REM line below is my custom script
call VBScript From Installation (MyApp_UninstallCleanup)
End
DuplicateFiles
BindImage
CreateShortcuts
...
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好,安装和卸载时工作正常.但是,如果我在现有版本的顶部安装了我的产品的新版本,则会出现以下顺序:a)安装新版本,在[CommonApplicationData]\MyApp文件夹和[Program Files]中创建各种文件MyApp ...,覆盖旧版本的文件b)运行我的vbs,删除[CommonApplicationData]\MyApp文件夹
我有新的MSI中升级表中列出的旧版本的GUID,除了这个自定义脚本之外,升级过程似乎正常.
产品本身非常小,如果安装程序在安装新版本之前总是完全删除以前的版本,那就没问题.工作站上没有需要保留的用户设置,文件大小也不大.因此,为简单起见,我希望卸载以前的版本,而不是只更改已更改的位.
有没有办法可以更改我的新MSI,以便先卸载以前的版本?
值得注意的是,我有许多公司安装了现有版本的MSI,其中包含自定义vbs.因此,解决方案确实需要能够应对现有已安装的msi.
我使用Wise Installation Express 7.0来创建MSI.
谢谢!!
(在这里交叉发布)
我有一个asp.net应用程序,它使用水晶报告显示报告.应用程序在我的本地PC上正常工作.我在我们的专用服务器上部署了这个应用程序,并在专用服务器上安装了水晶报告运行时引擎.当我尝试按报告以查看报告,我收到上述错误.我将文件夹"C:\ Windows\Temp"的权限更改为完全控制(通过选择"temp"文件夹的属性,所有用户的完全控制权限(IIS-users,network..etc)).我不确定这是否是给这个文件夹提供完全控制权限的正确方法(我对网络概念的了解不多).但是我仍然得到同样的错误.错误是:
检索具有CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}的组件的COM类工厂由于以下错误而失败:80070005访问被拒绝.(来自HRESULT的异常:0x80070005(E_ACCESSDENIED)).
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.UnauthorizedAccessException:检索具有CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}的组件的COM类工厂由于以下错误而失败:80070005访问被拒绝.(来自HRESULT的异常:0x80070005(E_ACCESSDENIED)).
ASP.NET无权访问所请求的资源.考虑将资源的访问权限授予ASP.NET请求标识.ASP.NET具有基本进程标识(IIS 5上通常为{MACHINE}\ASPNET,IIS 6和IIS 7上为网络服务,IIS 7.5上已配置的应用程序池标识),如果应用程序未模拟,则使用该标识.如果应用程序模拟通过,则标识将是匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户.
要授予对文件的ASP.NET访问权限,请在资源管理器中右键单击该文件,选择"属性",然后选择"安全"选项卡.单击"添加"以添加适当的用户或组.突出显示ASP.NET帐户,并选中所需访问的框.
我的应用偶尔会抛出一个未处理的异常:
System.InvalidOperationException is unhandled by user code Message=配置的执行策略“SqlAzureExecutionStrategy”不支持用户发起的事务。有关其他信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=309381。
我正在使用实体框架,其中我选择包含包含的表以获取由外键链接的第二个表。
根据异常链接,我正在使用“用户发起的交易”。Entity Framework Include 语句是否被视为“用户发起的事务”?
我正在使用默认策略:
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
Run Code Online (Sandbox Code Playgroud)
此代码引发异常:
requestType = _requestTypes.GetList().FirstOrDefault(x => x.Id == requestTypeId);
Run Code Online (Sandbox Code Playgroud)
这是 getlist 的定义:
public IEnumerable<RequestType> GetList()
{
var retList = DbContext
.RequestTypes
.Where(x => !x.Deleted)
.Include(t => t.RequestTypeWorkStreams)
.AsNoTracking()
.ToList();
return retList;
}
Run Code Online (Sandbox Code Playgroud) .net ×6
c# ×5
pinvoke ×2
sql-server ×2
.net-2.0 ×1
asp.net ×1
datareader ×1
encoding ×1
hosting ×1
interop ×1
marshalling ×1
permissions ×1
regasm ×1
registration ×1
registry ×1
role ×1
service ×1
uninstall ×1