- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个 COM 接口(interface),它应该允许在 Visual Basic 脚本中使用 For Each
和在 C++ 中使用 IEnumVariant
。问题是我不希望 C++ 客户端应用程序需要导入 mscorlib.tlb。
到目前为止我的界面是:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ICars : System.Runtime.InteropServices.ComTypes.IEnumVARIANT
{
int Count { get; }
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Cars : ICars
{
int ICars.Count => throw new NotImplementedException();
int IEnumVARIANT.Next(int celt, object[] rgVar, IntPtr pceltFetched)
{
throw new NotImplementedException();
}
int IEnumVARIANT.Skip(int celt)
{
throw new NotImplementedException();
}
int IEnumVARIANT.Reset()
{
throw new NotImplementedException();
}
IEnumVARIANT IEnumVARIANT.Clone()
{
throw new NotImplementedException();
}
}
TlbExp 吐出这段代码:
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: carsIEnumerator.tlb
[
uuid(3BBCEAA2-9498-48BF-8053-1CEFB3C1C86F),
version(1.0),
custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "ClassLibraryIEnumerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
]
library ClassLibraryIEnumerator
{
// TLib : // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
importlib("mscorlib.tlb");
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
// Forward declare all types defined in this typelib
interface ICars;
[
odl,
uuid(ABD2A9E4-D5C5-3ED9-88AF-4C310BD5792D),
version(1.0),
dual,
oleautomation,
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "ClassLibraryIEnumerator.ICars")
]
interface ICars : IDispatch {
[id(0x60020000), propget]
HRESULT Count([out, retval] long* pRetVal);
};
我怎样才能避免这种情况?
即使我只有自定义界面和单个类(不使用任何 .NET 类型),引用仍然存在。
最佳答案
IEnumVARIANT 类型声明必须来自某处。它不是每个编译器都知道的标准类型,如 int
。如果您自己编写 IDL,则可以使用 #import "oaidl.idl"
来包含定义。但这在 .NET 中行不通,因为类型库导出器不使用 IDL。所以它来自导出商确实知道的地方,mscorlib.tlb
解决方法是将接口(interface)声明放在您自己的代码中,而不是使用 mscorlib 中的接口(interface)声明。从 Reference Source 复制/粘贴它或者这个:
[Guid("00020404-0000-0000-C000-000000000046")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport]
public interface IEnumVARIANT
{
[PreserveSig]
int Next(int celt, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0), Out] object[] rgVar, IntPtr pceltFetched);
[PreserveSig]
int Skip(int celt);
[PreserveSig]
int Reset();
IEnumVARIANT Clone();
}
并在您的 ICars 声明中使用 YourNamespace.IEnumVARIANT。
声明您自己的枚举器接口(interface)类型也是一种解决方案,IEnumVARIANT 不会赢得任何奖励。你可以放弃没有人使用的靠不住的方法,你可以让它成为类型安全的。如果您也控制客户端代码,或者不必在脚本语言中保持 foreach
是一个可接受的替代方案。考虑:
[ComVisible(true)]
public interface ICarEnumerator {
ICar Next();
}
以及 ICars 接口(interface)中的 ICarEnumerator GetCars()
。
最后但同样重要的是,考虑完全不实现迭代器。在客户端代码中让它看起来像一个数组:
[ComVisible(true)]
public interface ICars
{
int Count { get; }
ICar this[int index] { get; }
}
关于C# COM 实现可枚举而不引用 MSCORLIB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408872/
我正在 VS2012 中运行我的应用程序,但遇到运行时错误; 当我查看“原始位置”时,我看到了 mscorlib.dll,但没有看到 mscorlib.pdb。 为什么会发生这种情况以及如何解决它?
我正在尝试将 Silverlight 支持添加到我最喜欢的编程语言 Nemerle。 Nemerle ,在编译过程中,主要分两步通过反射加载所有类型 1-) 使用 Assembly.LoadFrom
我最近正在调查一个构建失败,看到一条关于程序集之间冲突的警告。我深入挖掘,MSBuild 告诉我: There was a conflict between "mscorlib, Version=4.
我们正在使用 Razor 语法开发 Html 模板引擎,将 html 模板转换为 scrip# 代码。 当我们在 ScriptSharp 项目中添加 cshtml 文件时,visual studio
发现了 WCF 并因此开始探索它。这是一个 C# 控制台应用程序。代码工作正常,除非我尝试退出。如果我输入错误类型的数量,它会检测到(捕获),通知我输入无效并将我送回菜单提示。这很好而且花花公子,直到
我想将数据读入 RSAParameters 结构 ( RSAParameters ) 并检查了两次,确保数据正确。但是,我仍然收到错误“无效数据”异常: bei System.Security.
这个问题在这里已经有了答案: What does 'Cor' stand for? (2 个答案) 关闭 5 年前。 mscorlib 绝对是 .net 基类库之一,C# 中的每个程序都依赖于它,但
我在尝试编辑表格时遇到错误。请帮忙 ] 1 最佳答案 将我的 sql server 升级到 2014。问题是在 sql server 版本中未匹配。 关于sql-server - 调用目标抛出异常 (
循环时出现此错误 An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
我尝试重新启动远程 SQL 服务器(2012 full),但收到此错误: Unable to start service MSSQLSERVER on server (mscorlib) 每次我尝试时
有些事情我无法理解。我无法阅读类型引用: Assembly mscorlib = Assembly.Load("mscorlib"); // it DOES exist, returns type r
我正在研究 MSCoreLib,发现了一些有趣的东西。 我什至不知道它是如何工作的。 (引用 http://referencesource.microsoft.com/#mscorlib/system
我想给 mscorlib 添加一些方法。例如: 字符串abc; abc.IsNumeric() 我希望能解释我的问题。 最佳答案 您不能向 mscorlib 添加方法,但是您可以使用扩展方法,使它们看
我尝试为 Windows Phone Silverlight 运行单元测试。当抛出异常时,我不断收到下一个异常而不是真正的异常(例如,ParseException)。我认为这与它所要求的文化有关。 留
在混淆我的 WPF C# 应用程序时,它显示异常说明 Error occurred while obfuscation: System.IO.FileNotFoundException - Syste
大家好,我有一个 ASP.NET 网站项目,出于某种原因坚持引用 mscorlib 1.0.5 和 mscorlib 2.0,但我不明白为什么。 我已经使用 NDepend 分析了所有引用的 DLL,
我正在创建一个 COM 接口(interface),它应该允许在 Visual Basic 脚本中使用 For Each 和在 C++ 中使用 IEnumVariant。问题是我不希望 C++ 客户端
我有 Delphi 应用程序 (hostproject.exe),我想通过注册免费技术来使用 .net com 对象 (NetSide.dll)。 当应用程序启动时,显示并排配置错误和 sxtrace
我在我的电脑上安装了第 3 方程序。我在 ildasm.exe 中打开了这个程序附带的 .dll 之一并检查了 list : .assembly extern mscorlib { .publi
我有一个第三方库,它提供了一个 System.Collections.Generic.IReadOnlyCollection 类型,用于与 .NET 4.0 应用程序兼容。但是,如果您在 .NET 4
我是一名优秀的程序员,十分优秀!