首页
学习
活动
专区
工具
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 文件的命名空间和名称。

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

相关·内容

实现通过COM组件方式实现java调用C#写的DLL文件的完整demo

(注:下面红色框和箭头和需要注意的地方) image.png 2、右键项目属性,点击项目属性,看到下面这个界面,点击红色框框"程序信息,使程序com可见,打上勾,如下图所示 程序集中其他信息可以根据个人喜好可写可不写...5、在签名 标签中选中 为程序签名,选择刚刚生成的强名称文件CalcComkey.snk 。 ?...命名空间为:CalcTest、类名为:Calc 2、jacob下载,可以自主下载 二、实现步骤 1、将CalcTest.dll、CalcTest.tlb复制JAVA开发环境,JAVA环境需要安装对应版本的...把CalcTest.dll、CalcTest.tlb复制这个路径下面C:\Windows\Microsoft.NET\Framework64\v4.0.30319 注:图片中的InvokeTest.dll..._181\bin\InvokeTest.DLL 注:上面这个路径因人而异,找到你自己jdk的存放路径,把InvokeTest.dll、InvokeTest.tlb放到bin文件夹下面。

2.6K80

.NET实现之(ActiveX插件开发)

COM的开发是一种望而生畏的感觉,也许我们做.NET开发的程序的感觉开发组件DLL可能并没有多大难度,不需要去了解一些操作系统底层的东西比如:函数在编译过后重新编码对调用产生的影响,不同操作系统对可执行文件的内存分配回收等等问题...DLL文件怎样才能被OLE容器调用呢,就是通过.NET互操作COM来实现,我们开发的ActiveX插件要被浏览器这么一个大强的复合文档程序加载和使用的,所以我们得将托管的组件包装成非托管的等价的COM组件才行...COM等组件进行相互调用了,在我们程序目录中会生成一个和组件名称一样的tlb文件,必须有这个文件我们才能使用这个插件,tlb文件是一个类型库文件,作用就是将托管DLL文件的所有信息导出成COM规范的接口文件...,在这个tlb文件定义了COM的调用约定;由于COM和.NET组件无法直接交互所以只能通过tlb文件来确定我们的托管的DLL文件定义哪些东西;我们编译一下;我们还差一个HTML文件,这个文件随便是来自哪里都可以...:大文件上传、视频采集、照片动态采集等等;插件在部署的时候一定要注意,部署用户机器上的时候,在属性栏中有一个文件注册方式,一定要选择为COM注册这样才能在注册表添加相应的节点;ActiveX插件开发大概就讲完了

72110

关于引用mshtml的问题

对于开发者来说,引用其中任何一个都不会影响正常的开发。但问题会出在软件发布之后!在客户的机子上运行时,通常会提示文件的签名不正确,无法加载。 解决的方法就是删除现在对mshtml引用。...第二篇文章: 也是用到了Microsoft mshtml.dll程序,但是安装在用户电脑后,异常: System.Reflection.TargetInvocationException:...—> System.IO.FileNotFoundException: 未能加载文件程序“Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral,...属性选择: 复制本地=True 特定版本=false; 原因是: 因为 Microsoft.mshtmal.dll 这个 dll 是从 system32 文件夹下的 mshtml.tlb(...COM 类型库文件)中导出的,因此我们只需要用 VS2008 自带的 TlbImp.exe COM 类型库导出工具将这个 tlb 文件再导一遍就可以了。

1.1K10

【转】 COM 免注册技术

MS 推出 .Net 时采用了程序的方式来避免这个问题,同时也用文件清单的方式给 COM 带来了新的调用方案,由于不需要将类信息写入注册表,COM 文件的放置位置也可以放到 exe 所在文件夹或它的子目录...文件清单是一个 XML 格式的文本文件,其文件名后缀为 manifest(例如:程序名为 a.exe,则这个清单文件名为 a.exe.manifest),创建类实例时,操作系统(实际上是 ole32.dll...反复用 regsvr32 注册和注销 mycom.dll,结果应该都一样,这说明无论 COM 是否已注册,都可正常使用;更极端一点,你只复制 mycom.dll 和 test.exe 这两个文件其他有...补充: 可以将类描述部分单独放在清单文件,不一定要写入 exe 24 号资源,也就是说,不更改 vfp 编译 exe 时默认生成的 24 号资源,另外单独写一个清单文件一起发布,不重复的部分不会相互干扰...否则,还是像前面描述的那样比较可靠,将类描述信息插入复制的默认清单文件,并在更新 COM 时,同时发布更新的 COM 和重新编译的 EXE 文件

3K20

net框架运行原理

EXE或者DLL; 因此编译器同时产生元数据和IL代码,并且将它们嵌入生成的托管模块; 元数据在.net的作用: 元数据省去了源代码编译时对头文件和库文件的需求,编译器可以直接从托管模块取元数据来获得代码包含哪些成员和所有被引用的类型...; 程序集中有一些托管模块和资源文件,通过CLR处理后在内部得到所有文件的逻辑组合关系,得到一个清单数据块,这些内容描述了组成程序文件;注意:程序集中还包含它所引用的其它程序的一些信息,这些信息可以使程序实现自描述...,这样也就让CLR的执行不再到注册表取,因此让程序的部署要比非托管组件的部署容易得多; 安装VS08,其主要就是CLR的安装,CLR负责管理包含在程序集中的代码执行;系统文件的mscoree.dll...,CLR在加载程序的时候江通过这些信息定位应用程序的入口点方法,这样就启动了应用程序;注意非托管程序如果调用托管程序,托管程序DLL的入口函数也会去让CLR来处理包含在其中的代码; mscoree.dll...; CTS建立了以程序作为类型可见性边界的规则; IDE集成开发环境(VS.NET)自身不支持多文件程序,(必须通过命令行工具)

1.1K30

Attacking SQL Server CLR Assemblies

DLL 在SQL Server修改导出的CLR DLL并更改现有的CLR程序 使用自定义CLR 在 SQL Server中提升权限 什么是SQL Server的自定义CLR程序?...出于本博客的考虑,我们将公共语言运行时(CLR)程序定义为可导入SQL Server的.NET DLL(或DLL组),导入后DLL方法可以链接到存储过程并通过 TSQL执行,创建和导入自定义CLR程序的能力是开发人员扩展...,下面是一个PowerShell脚本示例,展示了如何将"cmd_exec.dll"文件转换为TSQL命令,该命令可用于在没有物理文件引用的情况下创建程序 # Target file $assemblyFile...| Format-Table -AutoSize 映射过程参数 攻击者并不是唯一创建不安全程序的人,有时开发人员会创建执行OS命令或与操作系统资源交互的程序,因此定位和逆向这些程序有时会导致权限提升错误...我们可以看到它只接受一个名为"execCommand"的字符串参数,针对存储过程的攻击者可能能够确定它可用于操作系统命令执 如何将SQL Server存在的CLR程序导出到DLL

1.6K20

文件系统:程序内嵌文件系统

一个物理文件可以直接作为资源内嵌编译生成的程序集中。...在正式介绍EmbeddedFileProvider之前,我们必须知道如何将一个项目文件作为资源嵌入编译生成的程序集中。...一、将项目文件变成内嵌资源 在默认情况下,我们添加到一个.NET Core项目中的静态文件并不会成为目标程序的内嵌资源文件。...针对上图所示的项目结构,如果我们将四个文本文件资源文件的形式内嵌生成的程序(App.dll程序的清单文件将会采用如下所示的形式来记录它们。...由于内嵌于程序资源文件采用扁平化存储形式,所以在通过 EmbeddedFileProvider构建的文件系统并没有目录层级的概念。我们可以认为所有的资源文件都保存在程序的“根目录”下。

1.4K30

VFP调用Selenium入门篇(一)

SeleniumBasic.dll和SeleniumBasic.tlb:这两个是类型库,提供了VBA环境中用到的SeleniumBasic命名空间中的对象、成员。...在VBA工程需要添加引用SeleniumBasic.tlb(我们VFP主要就是利用VBA来调用它) • RegAsm.bat:用于注册dll,因为释放到你电脑以后,只是把文件放到磁盘上了,要让dll和...tlb发挥作用,还需要向注册表写入内容。...因此需要用管理员权限运行该bat文件。 • UnRegAsm.bat:反注册。当你不再需要V3时,用管理员权限运行这个bat,可以从注册表移除写入的内容。相当于软件的卸载。...• WebDriver.dll和WebDriver.Support.dll:.NET语言所需的动态链接库 接下来我们使用VS2015对象浏览器查看一下这个SeleniumBasic.DLL,VFP的对象浏览器很弱

1.8K30

VFP调用C#编写的DLL控件

因为VFP出来时还没有.NET,所以VFP不支持.NET,C#编写出来的DLL控件需要转换成系统COM组件,才能够被VFP调用,当然不仅仅局限于C#与VFP之间的调用,各种语言都有自己写COM组件的方法...切换到“签名”选项卡  勾选“为程序签名”  在下面的下拉框里面选择“” ? 5、在弹出的对话框里面,输入MyKey。。或者随便取个名字   去掉“使用密码保护文件(P)”的选项 ?...如果没有生成.tlb文件,需要用管理员身份打开Visual Studio 2010,然后重新编译 注册过程: 开始→所有程序→Microsoft Visual Sutdio 2010→Visual Studio...在命令提示符下面,进入Dll所在的目录 C:\Windows\system32>cd/d E:\MyLib\MyLib\bin\Debug 用 gacutil /i MyLib.dll 将这个DLL加入的全局缓存里...E:\MyLib\MyLib\bin\Debug>gacutil/i mylib.dll 然后用 regasm MyLib.dll 注册这个dll E:\MyLib\MyLib\bin\Debug>regasmmylib.dll

2K00

实现用VB.Net(C#)开发K3 BOS 插件的真正可行方法

Net类组件与COM组件:VB6开发的ActiveX.dll 可以用regsvr32.exe 注册,它是适合COM规范的东西,.NET开发的类后缀也是dll,可是它们俩不是相同的东西,.NET(VB...,所以我们要VB6能调用.Netdll,那怎么办呢?...2、   .NET的强名strong name 说白了就是为了保护你的组件不被破坏,.Net开发的dll想给像com那样被调用那就必须加个强名(数字签名) ’---------------------...> 程序信息  下在 使程序COM可见 打勾 2) 进入 [项目]>[xxx属性]>编译  下  把 [为COM互操作] 打勾 3) 进入 [项目]>[xxx属性]>签名   下 把[为程序签名].../tlb: TestPlugIns.Net.dll 6)结束,在BOS开发环境下调用 这个注册后的dll即可 因为我建了一个窗体 所以多了一个 form这项 有没有看多出工具栏这几项菜单 上拉 斗地主

1.3K10

Fiddler 插件开发 将插件放在独立子文件夹防止 DLL 冲突

我的 Fiddler 安装了许多插件,有一些插件存在 DLL 名冲突问题,比如多个不同的插件都存在名为 PluginCore.dll 但实际实现逻辑完全不相同的程序。...本文将和大家介绍 Fiddler 官方提供的将插件放在独立子文件夹的方法,用来解决 DLL 命名冲突 在 Fiddler 里,安装自定义插件给 Fiddler 的最通用的方法就是将插件 DLL 和插件的依赖程序拷贝...我将使用这个插件和大家介绍如何将这个插件放入 Fiddler 的 Scripts 文件夹里面的里层文件夹内 先将插件程序的命名修改满足 Fiddler*.dll 规则,如将 Firday 插件命名为...修改程序名,可以右击项目属性,修改程序。...├Jgrass.FiddlerPlugin.dll └Newtonsoft.Json.dll 如此即可将插件放在独立的文件夹里面,防止和其他插件命名冲突 在日常开发,如果想要让开发更加方便

15010

C#将引用的dll嵌入exe文件

当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包exe 当然有多种方法可以打包, 比如微软的ILMerge,混淆器附带的打包......用代码打包的实现方式也有很好,本文只是其中一种实现方式,不需要释放文件!...方法如下: 1.项目下新建文件dll 2.把要打包的dll文件放在dll文件夹下,并包括在项目中 3.右键文件属性, 生成操作选择嵌入资源 4.实现如下代码, 在窗口构造实现也可以(在窗体事件无效...嵌入exe程序资源, 并实现程序加载失败事件(当在程序目录和系统目录下找不到程序触发), 当找不到程序时就从资源文件加载, 先转换为字节数组再转换到程序返回给程序, 这样dll就被加载到程序中了...如果exe所在文件夹下有相应dll, 事件并不会被触发!

3.6K20

Donut - 将 .NET 程序作为 Shellcode 注入

之所以这样称呼它们,是因为您选择的语言中的代码已“组装” CIL ,但并未真正编译。程序使用 PE 格式的扩展,并表示为包含 CIL 而不是本机机器代码的 EXE 或 DLL。...反射 DLL 加载中间 .NET 程序以处理错误并提高有效负载的稳定性。 中间 .NET 程序从子进程内的内存中加载您的 .NET 程序。 您的程序的主要入口点与您的命令行参数一起被调用。...但是您不能只将 .NET 程序转换为 shellcode。它们在运行时环境运行,而不是直接在硬件上运行。如果我们可以将 .NET 程序作为 shellcode 注入,那不是很好吗?是的。...NET 程序既可以从 URL 暂存,也可以通过直接嵌入 shellcode 无阶段进行。无论哪种方式,.NET 程序都使用 Chaskey 块密码和 128 位随机生成的密钥进行加密。...CLR Sentry 将注意每个加载 CLR 的非托管程序。 误报:这不会注意将 .NET 代码注入已加载 CLR 的进程

1.7K00
领券