Tag: com

使用ClickOnce应用程序部署COM组件

我们正在开发一个需要屏幕“录制”的C#WPF(.Net 4.0)应用程序。 我们已经评估了ByteScout的Screen Capture SDK (免费试用版),它完全符合我们的需求。 但是,问题是我们的应用程序旨在由ClickOnce部署到我们客户的计算机(不在我们的网络上),并且可能以有限的非管理用户身份登录。 SDK具有可再发行组件,但这需要单独安装 – 对ClickOnce没有好处。 ByteScout似乎在其文档中的“免注册部署”部分中解决了这一需求: /* * REGISTRRATION FREE SCENARIO DEPLOYMENT: allows to just copy DLLs from the SDK without installing them * See SAMPLE.EXE.manfest as the sample. * 1) Rename “SAMPLE.EXE.manifest” into the actual application name (eg “MyApp.exe.manifest”) * 2) Edit this .manifest file and replace “SAMPLE.EXE” with […]

如何让LINQPad转到Dump()系统.__ ComObject引用?

我正在使用LINQPad来快速开发小型ArcObjects (一个基于COM的ESRI ArcGIS软件库)应用程序,并且已经成功地将它用于Dump()我从.NET初始化的COM对象的属性,但是从现有COM对象获取的COM对象只是作为System.__ComObject引用转储,这不是特别有用: 这个帮助主题解释了为什么会发生这种情况,我认为我理解,但是想知道解决这种行为有哪些选择,特别是在使LINQPad(甚至)更强大的环境中。 有趣的是,Visual Studio的调试器能够显示这些对象的属性,甚至是值类型的值: Visual Studio使用什么机制来实现这种内省,为什么LINQPad的Dump方法不会这样做呢? 编辑:请参阅有关VS如何执行此操作的相关问题: Visual Studio的调试器/交互式窗口如何在.NET中转储COM对象的属性? ArcObjects .NET SDK包含带有RCW的PIA,每个CoClass可以通过COM接口实现,所以我认为应该可以以编程方式包装这些对象。 作为一种解决方法,我在LINQ查询中成功使用Marshal.CreateWrapperOfType()来强制LINQPad在我碰巧知道应该使用哪个CoClass时转储对象的属性。 当然,这只能正确转储值类型属性 – 任何基于COM的引用类型属性仍然报告为System.__ComObject ,因此正确的解决方案必须以递归方式工作以获取那些包装。 在之前的一个问题中,我了解到CoClass可以在运行时确定它是否实现了IPersist ,这是ArcObjects的很大一部分。 我可以以某种方式使用这种技术或其他技术自动将System.__ComObject从PIA System.__ComObject为适当的RCW吗? 如果是这样,我如何在LINQPad中实现它,例如通过提供ICustomMemberProvider实现? 这可以是递归的,这样也可以包装也是COM对象的属性吗? 我正在使用面向.NET 4.0的LINQPad 4.x,但我也对支持LINQPad 2.x感兴趣(因此,首选适用于.NET 3.5和.NET 4.0的解决方案,但这不是必需的)。 更新:我已经弄清楚我的问题的第一部分是如何使用IPersist.GetClassID返回的CLSID在其RCW中包装System.__ComObject 。 请参阅此相关问题和我正在使用的代码的答案 。 我仍然想知道如何将其用于LINQPad的Dump方法。

从没有COM的非托管C ++应用程序调用C#dll

有没有办法在没有COM使用的情况下从c ++非托管应用程序调用c#dll?

通过Skype4COM.dll COM API控制Skype

我正在使用C#使用Skype4COM.dll COM API ,它可以很好地满足我们所需的所有通信function。 我们正试图在Skype上放置一个更容易使用的界面,这个界面已经融入到我们的应用程序中。 我的麻烦在于控制或禁用哪些Skype窗口使用而不使用。 我认为我唯一需要的Skype窗口是Skypevideo电话/会议窗口。 我想隐藏和控制Skype可以呈现的每个窗口。 我甚至想禁用在来电时弹出的来电对话窗口,因为我们将展示我们自己的答案提示。 除了窗口管理之外,我对API很满意。 通过API,我可以看到如何启用Windows,但我似乎无法弄清楚如何隐藏它们,而不是将Skype消息发送到Skype应用程序。 我错过了什么吗? 谢谢你的帮助,肯尼

与ASP.NET的互操作’80040154类未注册’

我在运行IIS6的Windows XP Pro SP2 x64计算机上收到以下错误: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {3C250CBD-6CC9-11D2-9457-00004B48467E} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 尝试实例化COM互操作对象时会发生这种情况。 奇怪的是,这可以在与应用程序池(AD中的用户)相同的帐户下运行的控制台应用程序中正常工作。 即两者都使用UserX,所以它似乎不是一个明显的权限问题。 其他人有类似的东西吗?

使用reflection对COM对象调用方法

我有一个COM对象的实例…它是这样创建的: Type type = TypeDelegator.GetTypeFromProgID(“Broker.Application”); Object application = Activator.CreateInstance(type); 当我尝试调用方法时: type.GetMethod(“RefreshAll”).Invoke(application, null); – > type.GetMethod(“RefreshAll”)返回null 。 当我尝试使用type.GetMethods()获取所有方法时,只有以下方法: GetLifetimeService InitializeLifetimeService CreateObjRef 的ToString 等于 GetHashCode的 的GetType RefreshAll方法在哪里? 我怎么能调用呢?

从c ++ com加载项调用C#

我有一个用C ++编写的COM加载项(不是C ++ / CLI)。 我想从这个C ++ com库中调用一个C#库对象/方法。 我想这是CCW的图片,我现在正在阅读。 从你的经历中有没有快速指向这些东西? 另外,我在我的Com加载项中有一个方法,我希望我的C#库代码可以调用 – 即方法指针调用。 你能帮我告诉我怎样才能做到这一点 – 即我如何将方法指针传递给C#代码,以便以后可以调用它。 谢谢。

如何通过COM互操作将字符串集合从C#返回到C ++

我为C#中的一些Display方法创建了一个com组件,它返回一个String List 如下所示。 在v ++中,我使用std :: lst来捕获Disp()的返回值但是它 给出编译器错误,Disp不是类的成员。 我将返回类型设为void 它工作正常。 什么我可以修改,以便Disp返回一个List和main(c ++)我必须使用 这个回报值。 Public interface ITest { List Disp(); } class TestLib:ITest { List Disp() { List li=new List(); li.Add(“stack”); li.Add(“over”); li.Add(“Flow”); return li; } } 编译并成功创建了Test.dll,还测试了test.tlb。 现在在用c ++编写的main函数中 #include #import “..\test.tlb” using namespace Test; void main() { HRESULT hr=CoInitialize(null); ITestPtr Ip(__uuidof(TestLib)); std::list li=new std::list(); […]

WebBrowserSite:如何在派生类中调用私有COM接口方法?

这是挑战。 我是从Framework的WebBrowserSite类派生出来的。 我的派生类ImprovedWebBrowserSite一个实例是通过WebBrowser.CreateWebBrowserSiteBase返回的,我在WebBrowser类的派生版本中覆盖了它 – 专门用于提供自定义站点对象。 Framework的WebBrowser实现进一步将其传递给底层的非托管WebBrowser ActiveX控件。 到目前为止,我已经设法在我的ImprovedWebBrowserSite实现中覆盖IDocHostUIHandler (像这样 )。 我现在正在寻找更多的核心COM接口,比如IOleClientSite ,我想将它传递给WebBrowserSite 。 所有这些都通过ComImport暴露给COM,但是通过Framework的WebBrowserSite / UnsafeNativeMethods实现声明为private或internal 。 因此,我无法在派生类中明确地重新实现它们。 我必须定义自己的版本,就像我使用IDocHostUIHandler 。 所以,问题是,如何从我的派生类中调用WebBrowserSite定义的私有或内部COM接口的方法? 例如,我想调用IOleClientSite.GetContainer 。 我可以使用reflection(像这样 ),但这将是最后的手段,其次是从头开始重新实现WebBrowser 。 我的想法是,因为Framework的私有UnsafeNativeMethods.IOleClientSite和我自己的ImprovedWebBrowserSite.IOleClientSite都是COM接口,使用ComImport属性声明,相同的GUID和相同的方法签名。 .NET 4.0+中有COM类型等价 ,因此必须有一种方法可以在没有reflection的情况下完成。 [更新]现在我已经有了解决方案 ,我相信它为自定义WebBrowser控件的WinForms版本打开了一些新的和有趣的可能性。 这个版本的问题是在我最初尝试以更抽象的forms提出问题之后创建的,被评论员称为误导。 评论已被删除,但我决定保留这两个版本。 为什么我不想用reflection来解决这个问题? 原因如下: 依赖于内部或私有方法的实际符号名称,由WebBrowserSite的实现者给出,与COM接口不同,后者是关于二进制v表合同。 庞大的reflection代码。 例如,考虑通过Type.InvokeMember调用base的私有TranslateAccelerator ,我有大约20个这样的方法来调用。 虽然不太重要,但效率:通过reflection的后期绑定调用总是比通过v-table直接调用COM接口方法效率低。

已经与其基础RCW分离的COM对象无法使用 – 为什么会发生?

我有时会遇到以下exception:无法使用已与其基础RCW分离的COM对象 示例代码: using (AdOrganizationalUnit organizationalUnit = new AdOrganizationalUnit(ADHelper.GetDirectoryEntry(ouAdDn))) { using (AdUser user = organizationalUnit.AddUser(commonName)) { //set some properties user.Properties[key].Add(value); user.CommitChanges(); user.SetPassword(password); //it is set using Invoke //must be set after creating user user.Properties[“UserAccountControl”].Value = 512; user.CommitChanges(); } } AdUser看起来像这样: public class AdUser : DirectoryEntry { public AdUser(DirectoryEntry entry) : base(entry.NativeObject) { } public bool SetPassword(string […]