当前位置:  开发笔记 > 编程语言 > 正文

如何使用.NET升级COM组件

如何解决《如何使用.NET升级COM组件》经验,为你挑选了1个好方法。

我发现了一篇关于如何通过调用来提升用C++编写的COM对象 的文章CoCreateInstanceAsAdmin.但是我无法找到或做的是将.NET(c#)应用程序的一个组件实现为COM对象,然后调用该对象来执行需要UAC提升的任务.MSDN将此文档记录为管理COM对象模型.

我知道以管理员身份启动应用程序(或其他应用程序)是可行且非常容易的,以便在单独的过程中执行任务(例如参见Daniel Moth的帖子,但我正在寻找的是一种方式从同一个未提升的.NET可执行文件中做所有事情.当然,这样做会在新进程中生成COM对象,但是由于透明的编组,.NET COM对象的调用者不应该(也是很多)意识到这一点.

关于如何使用C#,C#项目,通过CoCreateInstanceAsAdminAPI 实现C#编写的COM对象的任何想法都会非常有用.所以我真的很想学习如何在C#中编写COM对象,然后我可以通过COM高程API从C#调用它.

不要紧,升高的COM对象是否在同一进程中运行.我只是不想要提升整个应用程序; 我想要提升将执行代码的COM对象.如果我能写出一些东西:

// in a dedicated assembly, marked with the following attributes:
[assembly: ComVisible (true)]
[assembly: Guid ("....")]

public class ElevatedClass
{
    public void X() { /* do something */ }
}

然后让我的主应用程序ElevatedClass通过CoCreateInstanceAsAdmin调用实现.但也许我只是在做梦.



1> Ryan..:

查看Windows Vista UAC演示示例代码

(您还需要针对UnsafeNativeMethods.CoGetObject方法的Vista Bridge示例)

这为您提供了C#代码,显示了几种不同的提升方式,包括COM对象

(不完整的代码示例 - 抓取上面的文件)

[return: MarshalAs(UnmanagedType.Interface)]
static internal object LaunchElevatedCOMObject(Guid Clsid, Guid InterfaceID)
   {
   string CLSID = Clsid.ToString("B"); // B formatting directive: returns {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 
   string monikerName = "Elevation:Administrator!new:" + CLSID;

   NativeMethods.BIND_OPTS3 bo = new NativeMethods.BIND_OPTS3();
   bo.cbStruct = (uint)Marshal.SizeOf(bo);
   bo.hwnd = IntPtr.Zero;
   bo.dwClassContext = (int)NativeMethods.CLSCTX.CLSCTX_ALL;

   object retVal = UnsafeNativeMethods.CoGetObject(monikerName, ref bo, InterfaceID);

   return (retVal);
}

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有