在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.
MSDN有关于[ComVisible]
属性的这篇文章.我不太清楚当一个人设置时会发生什么[ComVisible(true)]
.
MSDN说
该默认值为true,这表明托管类型是COM可见.不需要此属性来使公共托管程序集和类型可见 ; 它们在默认情况下对COM可见.只有公共类型才能显示.
所以他们说公共类型默认是COM可见的.但他们也说只有通过设置才能看到公共类型[ComVisible(true)]
.它没有意义:如果默认情况下公共类型是可见的,那么设置如何[ComVisible(true)]
使公共类型可见?如果它们已经可见,它们将如何变得更加醒目?
也许我的理解不正确.如果有人能对上述陈述有所了解,我将不胜感激.
我有一个用C#编写的COM可见DLL,我想在VB6应用程序中使用它.我有两个DLL的主要用例,我想知道该/codebase
选项何时适用以及何时最好在GAC中注册.
用例:
DLL将被加载到另一台开发人员PC上,并且需要在Project > References
菜单下的VB6 IDE中访问
当VB6应用程序发布时,DLL将被加载到生产机器上
有关适当使用的任何信息/codebase
都会有所帮助.
谢谢.
我使用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) 项目中的程序集具有标记为ComVisible(true)的类型.
构建(非提升)时,VS尝试注册该DLL并失败:
无法注册程序集"\ path\to\foo.dll" - 访问被拒绝.请确保您以管理员身份运行该应用程序.访问注册表项"HKEY_CLASSES_ROOT\CLSID {FFC174A1-CC90-4E25-A3F6-C30B03368250}"被拒绝.
我们真的不希望DLL在构建机器上注册.我们只想在为最终用户安装它时注册它.
那么可以在不注册DLL的情况下构建吗?
我有以下界面,我正在尝试使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.
我正在将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.我试过谷歌一些帮助,但没有成功.
ComVisible
regasm /codebase "assembly_path"
MyAssemblyName.dll.config
)在程序集的文件夹中ConfigurationManager.AppSettings["SettingName"]
CreateObject("...")
ConfigurationManager.AppSettings["SettingName"]
返回null.它看起来像程序集没有看到配置文件.我应该怎么做才能使它可行?
我想向COM公开.NET类.这很容易:
ComVisible
Guid
接口分配了一个没什么大不了.这一切都有效.但是,现在我的问题是:我在该类中有一些事件,我也希望向COM公开.
这应该没什么大不了的,但是,当我看一些例子(由MS'ComInterop工具生成的fi代码)时,我看到事件是在一个单独的接口中声明的.那就是:应该是的类ComVisible
,实现2个接口:
ComVisible
ComVisible
.现在,我的问题是:为什么?这是什么原因?
为什么ComVisible
在另一个接口中定义了事件,为什么它们只是在包含应该是的方法和属性的接口中没有定义ComVisible
?
这背后的原因是什么?