要将 .tlb 文件作为资源文件嵌入到 .NET 程序集 DLL 中,请按照以下步骤操作:
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);
}
}
}
var assembly = Assembly.GetExecutingAssembly();
var tlbName = "YourNamespace.YourTlbFile.tlb";
var yourType = ComHelper.GetTypeFromEmbeddedTlb(assembly, tlbName);
现在,您已经将 .tlb 文件作为资源文件嵌入到 .NET 程序集 DLL 中,并可以在代码中使用它。
注意:在使用此代码时,请确保将 "YourNamespace.YourTlbFile.tlb" 替换为您的实际 .tlb 文件的命名空间和名称。
领取专属 10元无门槛券
手把手带您无忧上云