首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将.tlb作为资源文件嵌入到.NET程序集DLL中?

要将 .tlb 文件作为资源文件嵌入到 .NET 程序集 DLL 中,请按照以下步骤操作:

  1. 在 Visual Studio 中打开您的项目。
  2. 将 .tlb 文件添加到项目中。
  3. 在解决方案资源管理器中,右键单击 .tlb 文件,然后选择“属性”。
  4. 将“生成操作”更改为“嵌入的资源”。
  5. 在代码中,使用以下代码加载嵌入的 .tlb 文件:
代码语言:csharp
复制
using System.Reflection;
using System.Runtime.InteropServices;

public static class ComHelper
{
    public static Type GetTypeFromEmbeddedTlb(Assembly assembly, string tlbName)
    {
        using (var stream = assembly.GetManifestResourceStream(tlbName))
        {
            if (stream == null)
            {
                throw new ArgumentException($"Embedded TLB resource '{tlbName}' not found.");
            }

            var data = new byte[stream.Length];
            stream.Read(data, 0, data.Length);

            var guid = Marshal.GetTypeLibGuidFromAssembly(assembly);
            var typeLib = new ComTypes.ITypeLib(data, (int)stream.Length);
            Marshal.ThrowExceptionForHR(typeLib.GetLibAttr(out var libAttr));

            var majorVersion = (ushort)((libAttr.wMajorVerNum & 0xFFFF) << 16);
            var minorVersion = (ushort)(libAttr.wMinorVerNum & 0xFFFF);

            var typeLibId = $"{{{guid.ToString().ToUpper()}}}{majorVersion:X4}{minorVersion:X4}";
            var typeLibRef = new ComTypes.TYPELIBATTR
            {
                guid = guid,
                wMajorVerNum = majorVersion,
                wMinorVerNum = minorVersion
            };

            var typeLibCache = new ComTypes.ITypeLibCache();
            Marshal.ThrowExceptionForHR(typeLibCache.PutTypeLib(ref typeLibId, ref typeLibRef, typeLib));

            var typeInfo = typeLib.GetTypeInfo(0);
            var typeInfoId = typeInfo.GetTypeInfoId();

            return Type.GetTypeFromCLSID(typeInfoId);
        }
    }
}
  1. 在代码中使用以下代码加载嵌入的 .tlb 文件:
代码语言:csharp
复制
var assembly = Assembly.GetExecutingAssembly();
var tlbName = "YourNamespace.YourTlbFile.tlb";
var yourType = ComHelper.GetTypeFromEmbeddedTlb(assembly, tlbName);

现在,您已经将 .tlb 文件作为资源文件嵌入到 .NET 程序集 DLL 中,并可以在代码中使用它。

注意:在使用此代码时,请确保将 "YourNamespace.YourTlbFile.tlb" 替换为您的实际 .tlb 文件的命名空间和名称。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

csc命令帮助

C:/>csc /help |more Microsoft (R) Visual C# 编译器版本7.00.9254 [CLR version v1.0.2914] 版权所有 (C) Microsoft Corp 2000-2001。保留所有权利。                       Visual C# 编译器选项                         - 输出文件 - /out:<文件>             输出文件名(如果未指定,则从第一个源文件派生) /target:exe             生成控制台可执行文件(默认) (缩写: /t:exe) /target:winexe          生成 Windows 可执行文件 (缩写: /t:winexe) /target:library         生成库 (缩写: /t:library) /target:module          生成能添加到其他程序集的模块 (缩写: /t:module) /define:<符号列表>      定义条件编译符号 (缩写: /d) /doc:<文件>             要生成的 XML 文档文件                         - 输入文件 - /recurse:<通配符>       根据通配符规范,包括当前目录和子目录下的所有文件 /reference:<文件列表>   从指定的程序集文件引用元数据 (缩写: /r) /addmodule:<文件列表>   将指定的模块链接到此程序集中                         - 资源 - /win32res:<文件>        指定 Win32 资源文件 (.res) /win32icon:<文件>       使用该图标输出 /resource:<资源信息>    嵌入指定的资源 (缩写: /res) /linkresource:<资源信息>将指定的资源链接到此程序集中 (缩写: /linkres)                         - 代码生成 - /debug[+|-]             发出调试信息 /debug:{full|pdbonly}   指定调试类型(“full”是默认类型,可以将调试程序 附加到正 在运行的程序) /optimize[+|-]          启用优化 (缩写: /o) /incremental[+|-]       启用增量编译 (缩写: /incr)                         - 错误和警告 - /warnaserror[+|-]       将警告视为错误 /warn:               设置警告等级 (0-4) (缩写: /w) /nowarn:<警告列表>      禁用指定的警告信息 /reference:<文件列表>   从指定的程序集文件引用元数据 (缩写: /r) /addmodule:<文件列表>   将指定的模块链接到此程序集中                         - 资源 - /win32res:<文件>        指定 Win32 资源文件 (.res) /win32icon:<文件>       使用该图标输出 /resource:<资源信息>    嵌入指定的资源 (缩写: /res) /linkresource:<资源信息>将指定的资源链接到此程序集中 (缩写: /linkres)                         - 代码生成 - /debug[+|-]             发出调试信息 /debug:{full|pdbonly}   指定调试类型(“full”是默认类型,可以将调试程序 附加到正 在运行的程序) /optimize[+|-]          启用优化 (缩写: /o) /incremental[+|-]       启用增量编译 (缩写: /incr)                         - 错误和警告 - /warnaserror[+|-]       将警告视为错误 /warn:               设置警告等级 (0-4) (缩写: /w) /nowarn:<警告列表>      禁用指定的警告信息                         - 语言 - /checked[+|-]           生成溢出检查 /unsafe[+|-]            允许“不安全”代码

02

关于引用mshtml的问题[通俗易懂]

今天看了个验证码识别的代码,其中引用到了mshtml.dll,找了半天原来就是microsoft.mshtml.dll。查这个dll的时候还发现了好几篇关于这个dll添加问题的文章。顺便看了下,原来这个dll有三个,添加引用时要注意了。 第一篇文章: 1.添加引用的问题 一般在开发环境下会在三个地方存有microsoft.mshtml.dll文件。所以在添加引用时,也会出现三个看似一样的项。对于开发者来说,引用其中任何一个都不会影响到正常的开发。但问题会出在软件发布之后!在客户的机子上运行时,通常会提示文件的签名不正确,无法加载。 解决的方法就是删除现在对mshtml引用。重新选择正确引用。就是选最下面那个。路径是:X:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll 。把引用对话框拉大,可以看到文件的路径。 2.类型选择错误 如果问题一解决了,或者开始就选对了。可能客户机了上运行又报 System._ComObject 无法强制转换到 HtmlWIndow2Class 、HtmlDocumentClass或其它类似的错误。在开发者的机子上运行,却完全正常。这时通常我们会狂抓,完全不知是什么原因!在开发环境下用obj.toString()显示是HtmlXXXXClass在客户机上得到结果却是System._ComObject.解决方法很简单用HtmlXXXX替换HtmlXXXXClass即可。 第二篇文章: 也是用到了Microsoft mshtml.dll程序集,但是安装在用户电脑后,异常: System.Reflection.TargetInvocationException: 调用的目标发生了异常。 —> System.IO.FileNotFoundException: 未能加载文件或程序集“Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。 选择高亮的那个dll就可以了。 属性选择: 复制本地=True 特定版本=false; 原因是: 因为 Microsoft.mshtmal.dll 这个 dll 是从 system32 文件夹下的 mshtml.tlb(COM 类型库文件)中导出的,因此我们只需要用 VS2008 自带的 TlbImp.exe COM 类型库导出工具将这个 tlb 文件再导一遍就可以了。

01
领券