标签: comvisible

使用ComVisible(false)时指定Guid有什么意义吗?

在Visual Studio中创建新的C#项目时,生成的AssemblyInfo.cs文件包含指定程序集GUID的属性.属性上方的注释表明它"如果此项目暴露给COM".

我的程序集都没有包含需要对COM可见的类型,因此我已经标记了我的程序集[assembly: ComVisible(false)].那么指定GUID有什么意义吗?

我的感觉是答案是"不" - 那么为什么默认的AssemblyInfo.cs文件包含[assembly: ComVisible(false)][assembly: Guid("...")]


编辑:

总结一下回答:

在它们之间,答案解释了当且仅当正在使用COM互操作时才需要指定GUID.所以,在我的情况下,没有必要使用GUID.

sharptooth进一步解释说,[assembly: ComVisible(false)]并不意味着不使用COM互操作,因为可以覆盖ComVisible各个类型.因此,默认的AssembyInfo.cs包含两者[assembly: ComVisible(false)]和GUID.

.net c# com guid comvisible

38
推荐指数
2
解决办法
2万
查看次数

与[ComVisible]默认和公共类COM暴露有什么关系?

MSDN有关于[ComVisible]属性的这篇文章.我不太清楚当一个人设置时会发生什么[ComVisible(true)].

MSDN说

默认值为true,这表明托管类型是COM可见.不需要此属性来使公共托管程序集类型可见 ; 它们在默认情况下对COM可见.只有公共类型才能显示.

所以他们说公共类型默认是COM可见的.但他们也说只有通过设置才能看到公共类型[ComVisible(true)].它没有意义:如果默认情况下公共类型是可见的,那么设置如何[ComVisible(true)]使公共类型可见?如果它们已经可见,它们将如何变得更加醒目?

也许我的理解不正确.如果有人能对上述陈述有所了解,我将不胜感激.

c# com comvisible

27
推荐指数
2
解决办法
3万
查看次数

RegAsm - /codebase选项何时适用?

我有一个用C#编写的COM可见DLL,我想在VB6应用程序中使用它.我有两个DLL的主要用例,我想知道该/codebase选项何时适用以及何时最好在GAC中注册.


用例:

  1. DLL将被加载到另一台开发人员PC上,并且需要在Project > References菜单下的VB6 IDE中访问

  2. 当VB6应用程序发布时,DLL将被加载到生产机器上


有关适当使用的任何信息/codebase都会有所帮助.

谢谢.

vb6 com dll comvisible regasm

18
推荐指数
1
解决办法
2万
查看次数

警告MSB3391:<DLL>不包含可以为COM Interop取消注册的任何类型

我使用VS2005制作了一个简单的C#DLL(这是一个更大的项目的一部分).我需要通过VBA代码在Excel中使用DLL,所以我在程序集上使用COM Interop.我正在尝试使构建过程自动生成必要的TLB文件,这样我就不需要在每次构建之后转到命令行并使用regasm.

我的问题是虽然DLL编译和构建正常,但它不会生成TLB文件.相反,标题中的错误在输出框中打印出来.

我已经获得了其他DLL来构建TLB文件,方法是转到VS2005中的项目属性 - > Build - > Output - > Check "Register for COM interop".另外,我在AssemblyInfo.cs中[assembly:ComVisible(true)].

以下是问题DLL的源代码摘要以及它为返回类型引用的DLL:

using System;
using System.IO;
using System.Runtime.InteropServices;
using SymbolTable;

namespace ProblemLibrary
{
    public class Foo
    {    
        public Foo(string filename)
        {
            ...
        }

        // method to read a text file into a SymbolTable
        public SymbolTable BuildDataSet(string[] selected)
        {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是SymbolTable.dll的摘要.它包含ProblemLibrary使用的返回类型.

using System;
using System.Collections.Generic;

namespace SymbolTable
{
    public class SymbolTable
    {
        readonly Dictionary<SymbolInfoStub, string> …
Run Code Online (Sandbox Code Playgroud)

c# com-interop comvisible typelib visual-studio

10
推荐指数
1
解决办法
1万
查看次数

是否可以使用COM可见类型构建.NET DLL而不需要VS提升?

项目中的程序集具有标记为ComVisible(true)的类型.

构建(非提升)时,VS尝试注册该DLL并失败:

无法注册程序集"\ path\to\foo.dll" - 访问被拒绝.请确保您以管理员身份运行该应用程序.访问注册表项"HKEY_CLASSES_ROOT\CLSID {FFC174A1-CC90-4E25-A3F6-C30B03368250}"被拒绝.

我们真的不希望DLL在构建机器上注册.我们只想在为最终用户安装它时注册它.

那么可以在不注册DLL的情况下构建吗?

com uac elevation comvisible visual-studio

8
推荐指数
1
解决办法
950
查看次数

是否可以使用.NET泛型类实现COM接口?

我有以下界面,我正在尝试使COM可见.当我尝试生成类型库时,它不喜欢我的实现类派生自泛型类的事实.

是否可以将泛型类用作COM实现类?(我知道我可以编写一个非通用的包装器并将其导出到COM,但是这会添加另一个我宁愿不用的层.)

[ComVisible(true)]
public interface IMyClass
{
   ...
}

[ComVisible(true), ComDefaultInterface(typeof(IMyClass))]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : BaseClass<IMyClass>, IMyClass
{
   ...
} 
Run Code Online (Sandbox Code Playgroud)

错误信息:

Warning: Type library exporter encountered a type that derives 
from a generic class and is not marked as 
[ClassInterface(ClassInterfaceType.None)]. Class interfaces cannot
be exposed for such types. Consider marking the type with 
[ClassInterface(ClassInterfaceType.None)] 
and exposing an explicit interface as the default interface to 
COM using the ComDefaultInterface attribute.

.net generics com comvisible

8
推荐指数
1
解决办法
6174
查看次数

在C++/CLI中是可见的

我正在将C++转换为C++/CLI,并希望将一些托管类公开为COM对象.在C#中它很容易并且设置[ComVisible]并继承自界面(也是ComVisible)完成了这项工作.但是,作为C++/CLI的C++项目构建不会导出DllRegisterServer.

这是示例项目(从VS 2008中的CLR控制台应用程序项目开始).

#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;

[ComVisible(true)]
[Guid("E3CF8A18-E4A0-4bc3-894E-E9C8648DC1F0")]
[InterfaceType(ComInterfaceType::InterfaceIsDual)]
public interface class ITestInterface
{
    void TestMethod();
};


[ComVisible(true)]
[Guid("1514adf6-7cb0-4561-9fbb-b75c0467149b")]
public ref class CliComClass : ITestInterface
{
    public: 
        virtual void TestMethod() 
        {
        }
};

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我在输出.exe上运行regsvr32时,我收到错误,说没有找到DllRegisterServer.我试过谷歌一些帮助,但没有成功.

c# com c++-cli comvisible

7
推荐指数
1
解决办法
4116
查看次数

ComVisible .NET程序集和app.config

  • 我有.NET程序集,其中一些类标记为 ComVisible
  • 此程序集已注册 regasm /codebase "assembly_path"
  • 我有app.config名称(实际 - - MyAssemblyName.dll.config)在程序集的文件夹中
  • 我通过我的程序集访问appSettings ConfigurationManager.AppSettings["SettingName"]
  • 我有VBScript文件,通过它创建我的COM对象 CreateObject("...")
  • 创建对象时(来自VBScript),ConfigurationManager.AppSettings["SettingName"]返回null.它看起来像程序集没有看到配置文件.

我应该怎么做才能使它可行?

c# app-config comvisible .net-4.0

5
推荐指数
1
解决办法
3560
查看次数

将.NET类(具有事件)暴露给COM

我想向COM公开.NET类.这很容易:

  • 我创建了一个接口,我在其中定义了应该是ComVisible的类的成员
  • 我自己定义了这些成员的DispId
  • 我定义接口应该是 ComVisible
  • 我为该Guid接口分配了一个
  • 我创建了一个实现该接口的类

没什么大不了.这一切都有效.但是,现在我的问题是:我在该类中有一些事件,我也希望向COM公开.
这应该没什么大不了的,但是,当我看一些例子(由MS'ComInterop工具生成的fi代码)时,我看到事件是在一个单独的接口中声明的.那就是:应该是的类ComVisible,实现2个接口:

  • 一个接口,它定义了应该使用的常规方法和属性 ComVisible
  • 另一个定义应该是的事件的接口ComVisible.

现在,我的问题是:为什么?这是什么原因?

为什么ComVisible在另一个接口中定义了事件,为什么它们只是在包含应该是的方法和属性的接口中没有定义ComVisible

这背后的原因是什么?

.net c# com comvisible

4
推荐指数
1
解决办法
2459
查看次数