{"id":25609554,"url":"https://github.com/dspace-group/dscom","last_synced_at":"2025-05-16T08:03:20.575Z","repository":{"id":37953641,"uuid":"465786734","full_name":"dspace-group/dscom","owner":"dspace-group","description":"dscom, a toolkit for creating and registering type libraries (tlb) and additional interop helper methods for COM","archived":false,"fork":false,"pushed_at":"2025-05-13T06:31:40.000Z","size":1224,"stargazers_count":90,"open_issues_count":1,"forks_count":21,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-05-13T06:32:56.951Z","etag":null,"topics":["com","convertassemblytotypelib","csharp","dotnet","dotnet-core","dotnetcore","interop","ole","tlb","tlbexp","typelib","typelibconverter"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dspace-group.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-03-03T15:57:40.000Z","updated_at":"2025-03-20T12:19:51.000Z","dependencies_parsed_at":"2022-07-18T10:39:05.034Z","dependency_job_id":"b267cbec-2b73-4ca0-a89c-6f3c8dc85760","html_url":"https://github.com/dspace-group/dscom","commit_stats":{"total_commits":129,"total_committers":8,"mean_commits":16.125,"dds":0.3798449612403101,"last_synced_commit":"170b0f4e7ae79bcec3cfa2a78dc2749f4a6db664"},"previous_names":[],"tags_count":73,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspace-group%2Fdscom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspace-group%2Fdscom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspace-group%2Fdscom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspace-group%2Fdscom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dspace-group","download_url":"https://codeload.github.com/dspace-group/dscom/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253891774,"owners_count":21979855,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["com","convertassemblytotypelib","csharp","dotnet","dotnet-core","dotnetcore","interop","ole","tlb","tlbexp","typelib","typelibconverter"],"created_at":"2025-02-21T21:41:06.573Z","updated_at":"2025-05-16T08:03:20.542Z","avatar_url":"https://github.com/dspace-group.png","language":"C#","readme":"# dSPACE COM tools\n\n[![Nuget:Cli](https://img.shields.io/nuget/v/dscom?label=dscom\u0026style=flat)](https://www.nuget.org/packages/dscom/)  \n[![Nuget:Lib](https://img.shields.io/nuget/v/dSPACE.Runtime.InteropServices?label=dSPACE.Runtime.InteropServices\u0026style=flat)](https://www.nuget.org/packages/dSPACE.Runtime.InteropServices/)  \n[![Nuget:LibBuildTask](https://img.shields.io/nuget/v/dSPACE.Runtime.InteropServices?label=dSPACE.Runtime.InteropServices.BuildTasks\u0026style=flat)](https://www.nuget.org/packages/dSPACE.Runtime.InteropServices.BuildTasks/)  \n\n[![Release](https://img.shields.io/github/v/release/dspace-group/dscom?label=release)](https://github.com/dspace-group/dscom/releases)\n![License](https://img.shields.io/github/license/dspace-group/dscom)\n[![dSPACE](https://img.shields.io/badge/-OpenSource%20powered%20by%20dSPACE-blue)](https://www.dspace.com/)\n\n[![Unit Tests](https://github.com/dspace-group/dscom/actions/workflows/unit-test.yaml/badge.svg)](https://github.com/dspace-group/dscom/actions/workflows/unit-test.yaml)\n[![Example Tests](https://github.com/dspace-group/dscom/actions/workflows/example-test.yaml/badge.svg)](https://github.com/dspace-group/dscom/actions/workflows/example-test.yaml)\n[![Code Style Check](https://github.com/dspace-group/dscom/actions/workflows/code-style.yaml/badge.svg)](https://github.com/dspace-group/dscom/actions/workflows/code-style.yaml)\n\nThe command line client `dscom` is a replacement for `tlbexp.exe` and `RegAsm.exe`.  \nAmong other things, you can create or register TLBs from .NET assemblies.  \n\nThe `dSPACE.Runtime.InteropServices` library contains various classes and methods for COM.  \nIt can be used in `net5+` or in `net48` projects.  \nWith the library you can register assemblies and classes for COM and programmatically generate TLBs at runtime.  \n\nThe `dSPACE.Runtime.InteropServices.BuildTasks` library provides build tasks which can be used to automatically generate TLBs at compile time.\n\n- [dSPACE COM tools](#dspace-com-tools)\n  - [Introduction](#introduction)\n  - [Command Line Client](#command-line-client)\n    - [Installation](#installation)\n    - [Usage](#usage)\n  - [Library](#library)\n    - [TypeLibConverter.ConvertAssemblyToTypeLib](#typelibconverterconvertassemblytotypelib)\n    - [TypeLibEmbedder.EmbedTypeLib](#typelibembedderembedtypelib)\n    - [RegistrationServices.RegisterTypeForComClients](#registrationservicesregistertypeforcomclients)\n    - [RegistrationServices.RegisterAssembly](#registrationservicesregisterassembly)\n  - [Build Tasks](#build-tasks)\n    - [Build task usage](#build-task-usage)\n      - [Enforcing to stop the build, if an error occurs](#enforcing-to-stop-the-build-if-an-error-occurs)\n    - [Parameters](#parameters)\n    - [Example](#example)\n    - [Hints](#hints)\n  - [32Bit support](#32bit-support)\n  - [Migration notes (mscorelib vs System.Private.CoreLib)](#migration-notes-mscorelib-vs-systemprivatecorelib)\n    - [Why can I load a .NET Framework library into a .NET application?](#why-can-i-load-a-net-framework-library-into-a-net-application)\n  - [Limitations](#limitations)\n    - [RegisterAssembly](#registerassembly)\n    - [RegAsm](#regasm)\n  - [Contributing](#contributing)\n\n## Introduction\n\nFortunately, .NET still supports COM, but there is no support for generating TLBs.  \nFrom the Microsoft documentation:\n\n\u003e Unlike in .NET Framework, there is no support in .NET Core or .NET 5+ for generating a COM Type Library (TLB) from a .NET assembly.\n\n\u003chttps://docs.microsoft.com/en-us/dotnet/core/native-interop/expose-components-to-com\u003e\n\nOne main goal is to make `dscom` behave like `tlbexp.exe`.\n\nAlso, some classes are missing in .NET 5+ that were available in the full framework.\nThis is where `dSPACE.Runtime.InteropServices` may be able to help.\n\n## Command Line Client\n\nThe command-line interface (CLI) tool `dscom` is a replacement for `tlbexp.exe`, `OleView` (View TypeLib) and `RegAsm.exe`.\n\nIt supports the following features:\n\n- Convert an assembly to a type library\n  - Optionally embed the generated type library into the converted assembly\n- Convert a type library to `YAML` file\n- Register a type library\n- Unregister a type library\n- Embeds a type library into an existing assembly\n- Register an assembly (regasm.exe)\n- Unregister an assembly (regasm.exe)\n\n### Installation\n\nThe installation is quite simple. You can use `dotnet tool` to install the `dscom` binary if you want to create a 64Bit TLB.\n\n```bash\ndotnet tool install --global dscom\n```\n\nHere you can find all available versions:  \n\u003chttps://www.nuget.org/packages/dscom/\u003e\n\nAlternatively you can download dscom.exe from the relase page.  \n\u003chttps://github.com/dspace-group/dscom/releases\u003e\n\n### Usage\n\nUse `dscom --help` to get further information.  \n\n```bash\nc:\\\u003e dscom --help\nDescription:\n  dSPACE COM tools\n\nUsage:\n  dscom [command] [options]\n\nOptions:\n  --version       Show version information\n  -?, -h, --help  Show help and usage information\n\nCommands:\n  tlbexport \u003cAssembly\u003e                           Export the assembly to the specified type library\n  tlbdump \u003cTypeLibrary\u003e                          Dump a type library\n  tlbregister \u003cTypeLibrary\u003e                      Register a type library\n  tlbunregister \u003cTypeLibrary\u003e                    Unregister a type library\n  tlbembed \u003cSourceTypeLibrary\u003e \u003cTargetAssembly\u003e  Embeds a source type library into a target file\n  regasm \u003cTargetAssembly\u003e                        Register an assembly\n```\n\n## Library\n\nUsage:  \n\n```bash\ndotnet add package dSPACE.Runtime.InteropServices\n```\n\ndSPACE.Runtime.InteropServices supports the following methods and classes:  \n\n- TypeLibConverter\n  - ConvertAssemblyToTypeLib\n- TypeLibEmbedder\n  - EmbedTypeLib\n- RegistrationServices\n  - RegisterTypeForComClients\n  - UnregisterTypeForComClients\n  - RegisterAssembly\n  - UnregisterAssembly\n\n### TypeLibConverter.ConvertAssemblyToTypeLib\n\nIf you miss the `TypeLibConverter` class and the `ConvertAssemblyToTypeLib` method in `.NET`, then the `dSPACE.Runtime.InteropServices` might help you.\nThis method should behave compatible to the `.NET Framework` method.\n\n```csharp\npublic object? ConvertAssemblyToTypeLib(\n  Assembly assembly,\n  string tlbFilePath,\n  ITypeLibExporterNotifySink? notifySink)\n```\n\n\u003chttps://www.nuget.org/packages/dSPACE.Runtime.InteropServices/\u003e\n\nExample:\n\n```csharp\nusing dSPACE.Runtime.InteropServices;\n\n// The assembly to convert\nvar assembly = typeof(Program).Assembly;\n\n// Convert to assembly\nvar typeLibConverter = new TypeLibConverter();\nvar callback = new TypeLibConverterCallback();\nvar result = typeLibConverter.ConvertAssemblyToTypeLib(assembly, \"MyTypeLib.tlb\", callback);\n\n// Get the name of the type library\nvar typeLib2 = result as System.Runtime.InteropServices.ComTypes.ITypeLib2;\nif (typeLib2 != null)\n{\n    typeLib2.GetDocumentation(-1, out string name, out _, out _, out _);\n    Console.WriteLine($\"TypeLib name: {name}\");\n}\n\n// The callback to load additional type libraries, if necessary\npublic class TypeLibConverterCallback : ITypeLibExporterNotifySink\n{\n    public void ReportEvent(ExporterEventKind eventKind, int eventCode, string eventMsg)\n    {\n        Console.WriteLine($\"{eventCode}: {eventMsg}\");\n    }\n\n    public object? ResolveRef(System.Reflection.Assembly assembly)\n    {\n        // Returns additional type libraries\n        return null;\n    }\n}\n```\n\n### TypeLibEmbedder.EmbedTypeLib\n\n.NET +6 introduced ability to embed type library into assemblies with the ComHostTypeLibrary property. However, using this is not fully compatible with the dscom build tools as it requires a type library to be already generated prior to the build. This class provides the implementation for embedding a type library into an assembly via Win32 API p/invoke calls.\n\nThe class and method are static, so you only need to create a settings to provide parameter for the source type library and the target assembly for where the type library will be embedded.\n\nIt is important to note that type libraries are _not_ bit-agnostic and therefore, it will not make sense to embed them in an AnyCPU assemblies. For .NET 5.0 and greater, that is not an issue since the generated *.comhost.dll are tied to a specific bitness. For .NET 4.8, it is strongly recommended that the assembly be built with either x64 or x86 rather than AnyCPU.\n\n```csharp\npublic static bool EmbedTypeLib(\n    TypeLibEmbedderSettings settings\n)\n```\n\nExample:\n\n```csharp\nusing dSPACE.Runtime.InteropServices;\n\nvar settings = new TypeLibEmbedderSettings\n{\n    SourceTlbPath = \"C:\\\\path\\\\to\\\\type\\\\library.tlb\",\n    TargetAssembly = \"C:\\\\path\\\\to\\\\assembly.dll\"\n};\nTypeLibEmbedder.EmbedTypeLib(settings);\n```\n\nIMPORTANT: Embedding the type library will alter the assembly, which may cause issues with signing the assembly. Therefore, the scenario of signing the assembly with a certificate or a strong name is not tested. If it is required that the assembly be signed, it is recommended that a build script be used to ensure proper sequence of steps is executed.\n\nIMPORTANT: In order to embed the type library into the built assembly, the process must unload the assembly. As dotnet restricts the usage of unloadable assemblies via AssemblyLoadContext to pure CLR assemblies, embedding TLBs into an assembly may only work, if none of the assemblies loaded via `--asmpath` may be a mixed mode C++/CLI assembly. In this case, please use to different calls to `dscom.exe` / `dscom32.exe` or the separate dscom build tasks. For more information refer to issue [#292](https://github.com/dspace-group/dscom/issues/292).\n\n### RegistrationServices.RegisterTypeForComClients\n\nThe `dSPACE.Runtime.InteropServices.RegistrationServices` provides a set of services for registering and unregistering managed assemblies for use from COM.\n\nThis method is equivalent to calling CoRegisterClassObject in COM.  \nYou can register a .NET class so that other applications can connect to it (For example as INPROC_SERVER or as a LOCAL_SERVER).  \n\nA outproc demo application is available here: [examples\\outproc](https://github.com/dspace-group/dscom/tree/main/examples/outproc)\n\nExample:  \n\n```csharp\nusing dSPACE.Runtime.InteropServices;\n\nvar registration = new RegistrationServices();\nvar cookie = registration.RegisterTypeForComClients(typeof(Server.Common.Greeter), \n  RegistrationClassContext.LocalServer, \n  RegistrationConnectionType.MultipleUse);\n\nConsole.WriteLine($\"Press enter to stop the server\");\nConsole.ReadLine();\n\nregistration.UnregisterTypeForComClients(cookie);\n```\n\n### RegistrationServices.RegisterAssembly\n\nRegisters the classes in a managed assembly to enable creation from COM.  \n\n```csharp\nusing dSPACE.Runtime.InteropServices;\n\nvar registration = new RegistrationServices();\n\n// Register MyAssembly\nregistration.RegisterAssembly(typeof(MyAssembly), true);\n\n// Unregister MyAssembly\nregistration.UnregisterAssembly(typeof(MyAssembly), true);\n```\n\n## Build Tasks\n\nThe `dSPACE.Runtime.InteropServices.BuildTasks` assembly and NuGet package provide the ability to create type libraries for a certain assembly at compile time.\n\n### Build task usage\n\nTo create a type library at compile time, simply add a reference to the nuget package, e.g. by using the command line.\n\n```shell\ndotnet add package dSPACE.Runtime.InteropServices.BuildTasks\n```\n\nThe result should be a line as follows in your `.csproj` file:\n\n```xml\n    \u003cPackageReference Include=\"dSPACE.Runtime.InteropServices.BuildTasks\" Version=\"0.17.0\" NoWarn=\"NU1701\"\u003e\n      \u003cIncludeAssets\u003eruntime; build; native; contentfiles; analyzers; buildtransitive\u003c/IncludeAssets\u003e\n      \u003cPrivateAssets\u003eall\u003c/PrivateAssets\u003e\n    \u003c/PackageReference\u003e\n```\n\n**Note**: The extra attribute `NoWarn=\"NU1701\"` is only required, if neither `.NET 4.8` nor `.NET 6.0` are targeted, since dotnet pack will currently not create a .NETStandard 2.0 compliant NuGet Package.\n\n#### Enforcing to stop the build, if an error occurs\n\nThe build tasks puts a warning to the build log, if the desired type library has not been created, even if the backend has reported a success.\n\nThis warning is issued with the warning code `DSCOM001`, which can be collected in the `WarningsAsErrors` array:\n\n```XML\n\u003cWarningsAsErrors\u003e$(WarningsAsErrors);DSCOM001\u003c/WarningsAsErrors\u003e\n```\n\nThis way the build stops, if the type library is not exported.\n\n### Parameters\n\nThe build task can be parameterized with the following [properties](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-properties?view=vs-2022):\n\n| **Name**                                       | **Description**                                                                                |\n| ---------------------------------------------- | ---------------------------------------------------------------------------------------------- |\n| _DsComTlbExt                                   | Extension of the resulting type library. \u003cbr/\u003e Default Value: `.tlb`                           |\n| DsComTypeLibraryUniqueId                       | Overwrite the library UUID \u003cbr/\u003e Default Value: Empty Guid                                     |\n| DsComOverideLibraryName                        | Overwrite the IDL name of the library. \u003cbr/\u003e Default Value: Empty string                       |\n| DsComRegisterTypeLibrariesAfterBuild           | Use regasm call after the build to register type library after the build \u003cbr/\u003e Default value: `false` |\n| DsComTlbExportAutoAddReferences                | Add referenced assemblies automatically to type libraries \u003cbr/\u003e Default value: `true`          |\n| DsComTlbExportIncludeReferencesWithoutHintPath | If a `Reference` assembly does not provide a `HintPath` Metadata, the item spec shall be task. \u003cbr/\u003e Default value: `false` |\n| DsComExportTypeLibraryTargetFile               | Path to the resulting file. \u003cbr/\u003e Default value: `$(TargetDir)\\$(TargetName)$(_DsComTlbExt)` * |\n| DsComExportTypeLibraryAssemblyFile             | Path to the source assembly file. \u003cbr/\u003e Default value: `$(TargetPath)` *                       |\n| DsComTypeLibraryEmbedAfterBuild                | Embeds the generated type library into the source assembly file. \u003cbr /\u003e Default value: `false` |\n\nThe build task consumes the following [items](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-items?view=vs-2022):\n\n| **Name**                     | **Description**                                          |\n| ---------------------------- | -------------------------------------------------------- |\n| DsComTlbExportTlbReferences  | Referenced type library files.                           |\n| DsComTlbExportReferencePaths | Directories containing type libraries to use for export. |\n| DsComTlbExportAssemblyPaths  | Assemblies to add for the export.                        |\n| DsComTlbAliasNames           | Names to use as aliases for types with aliases.          |\n\nThe CLI based task consumes these additional [properties](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-properties?view=vs-2022):\n\n| **Name**                     | **Description**                                          |\n| ---------------------------- | -------------------------------------------------------- |\n| DsComToolVerbose             | Enables `verbose` option.                                |\n| DsComToolSilent              | Enables `silent` option.                                 |\n\nThe CLI based task consumes these additional [items](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-items?view=vs-2022):\n\n| **Name**                     | **Description**                                          |\n| ---------------------------- | -------------------------------------------------------- |\n| DsComToolSilence             | Enables `silence` option for the given warnings          |\n\n### Example\n\n```xml\n\u003cProject Sdk=\"Microsoft.NET.Sdk\"\u003e\n   \u003cPropertyGroup\u003e\n      \u003cDsComTypeLibraryUniqueId\u003ef74a0889-2959-4e7b-9a1b-f41c54f31d74\u003c/DsComTypeLibraryUniqueId\u003e\n   \u003c/PropertyGroup\u003e\n   \u003cItemGroup\u003e\n    \u003cDsComTlbExportTlbReferences Include=\"C:\\Path\\To\\My.tlb\" /\u003e\n    \u003cDsComTlbExportAssemblyPaths Include=\"C:\\Path\\To\\Assemblies\\Dependency.dll\" /\u003e\n    \u003cDsComTlbExportReferencePaths Include=\"C:\\Path\\To\\Additional\\TypeLibraries\\\" /\u003e\n   \u003c/ItemGroup\u003e\n\u003c/Project\u003e\n```\n\n### Hints\n\nWhen using the build tasks to create an 32 bit version for your type libraries / projects: The tasks require the .NET runtime in their specific CPU architecture to be installed.\n\nSo, for building 32 bit TLBs, dscom32 will be executed, which **requires** .NET runtime in x86 flavor to be available.\n\n## 32Bit support\n\n`dscom` installed by `dotnet tool install` can only handle AnyCPU or 64Bit assemblies and can only generate a 64bit TLB.\nDepending on whether you want to process 32bit or 64bit assemblies, you need to download different executables from the [release page](https://github.com/dspace-group/dscom/releases).\n\n- **dscom.exe** to create a 64Bit TLB from a AnyCPU or a 64Bit assembly\n- **dscom32.exe** to create a 32Bit TLB from a AnyCPU or a 32Bit assembly\n\n\u003e Warning!  \n\u003e If your assembly is an AnyCPU assembly, then an yourassemblyname.comhost.dll is created as a 64 bit dll.  \n\u003e Therefore after calling regserv32.exe a 64 bit dll is registred.  \n\u003e To prevent this it is **recommended that the assembly is compiled as a 32 bit assembly** and not as an AnyCPU assembly.  \n\u003e see: \u003chttps://github.com/dotnet/runtime/issues/32493\u003e\n\n\u003e Warning!\n\u003e In order to use 32 bit support with the build targets, the x86 version of .NET must be installed, as dscom requests the hostfxr.dll to be loaded.\n\n## Migration notes (mscorelib vs System.Private.CoreLib)\n\nBoth assemblies are **ComVisible=false** but lot of .NET Framework types are **ComVisible=true**.\nBut this is not the case for .NET (.NET Core and .NET \u003e= 5).  \nUnlike mscorelib (the good old .NET Framework), no tlb is shipped for .NET.\n\nAs example the `System.Exception` class:\n\nIn case of mscorelib the `System.Exception` class is **ComVisible=true**:\n\n```csharp\n[Serializable]\n[ClassInterface(ClassInterfaceType.None)]\n[ComDefaultInterface(typeof(_Exception))]\n[ComVisible(true)]\npublic class Exception : ISerializable, _Exception\n```\n\nIn case of `System.Private.CoreLib` (.NET Core and .NET \u003e=5), the `Exception` class is **ComVisible=false**\n\n```csharp\n[Serializable]\n[TypeForwardedFrom(\"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\")]\npublic class Exception : ISerializable\n{\n```\n\nThe `_Exception` class interface (default interface in this case) is not available in .NET (.NET Core and .NET \u003e=5).\n\n### Why can I load a .NET Framework library into a .NET application?\n\nThe magic is in `TypeForwardedFromAttribute`.  \nIf you try to load an .NET Framework assembly inside a .NET (.NET Core and .NET \u003e=5) application, the runtime will forward the original type to\na type defined in the `System.Private.CoreLib` assembly.\n\n```il\nclassextern forwarder System.Exception\n{\n    .assemblyextern System.Private.CoreLib\n}\n```\n\n**Therefore you should make sure that you do not use any types from the `mscorelib` typelib in your .NET Framework project if you plan to migrate to .NET 5+**\n\n## Limitations\n\n- No imports of the `mscorelib` typelib (all types are **VT_UNKNOWN**)\n  - \\_Object not supported\n  - \\_EventArgs not supported\n  - \\_Delegate not supported\n  - \\_Type not supported\n  - System.Runtime.Serialization.ISerializable not supported\n  - System.ICloneable not supported\n  - System.IDisposable not supported\n  - System.Array not supported\n  - ...\n- `TypeLibExporterFlags` is not supported\n- `ITypeLibExporterNotifySink` is not COM visible\n- `TypeLibConverter` is not COM visible\n- `AutoDual` is not supported\n  - see: \u003chttps://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2015/code-quality/ca1408-do-not-use-autodual-classinterfacetype?view=vs-2015\u0026redirectedfrom=MSDN\u003e\n- LCID only NEUTRAL is supported\n- No GAC support\n  - see: \u003chttps://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/5.0/global-assembly-cache-apis-obsolete\u003e\n- IEnumerator is converted to `IEnumVARIANT` (stdole)\n- Guid is converted to `GUID` (stdole)\n- Color is converted to `OLE_COLOR`(stdole)\n- No support for `UnmanagedType.CustomMarshaler`\n- No support for .NET Framework assemblies with `AssemblyMetadataAttribute` value \".NETFrameworkAssembly\"\n- Using DsComTypeLibraryEmbedAfterBuild=true in combination with the Default ComHost due to a cyclic dependency in .NET SDK [#286](https://github.com/dspace-group/dscom/issues/286).\n\n### RegisterAssembly\n\n- InProc Registration only will take place, if a comhost assembly is present.\n- No CustomRegisterFunction Or CustomUnRegisterFunction Attribute support\n- No PrimaryInteropAssembly Support\n\n### RegAsm\n\n| feature | dscom |\n| -- | -- |\n| assemblyFile | **supported** |\n| codebase | **supported** |\n| registered | not supported |\n| asmpath | **supported** |\n| nologo | not supported |\n| regfile | not supported |\n| silent | not supported |\n| tlb | **supported** |\n| unregister | **supported** |\n| verbose | not supported |\n| help | **supported** |\n\n## Contributing\n\nWe would be happy if you would like to contribute to this project.  \n\nWe use VSCode as IDE, but feel free to use your preferred IDE.  \nYou need \u003e= .NET 8.0 SDK and .NET Full Framework \u003e= 4.8 SDK installed on your machine.  \nBefore submitting a pull request, please note the following points:  \n\n1. **Code Formatting**  \n    Ensure the code is properly formatted using `dotnet format --verify-no-changes`.\n\n2. **Unit Tests**  \n    Run all tests with `dotnet test` and make sure all tests pass successfully.\n    Use `dotnet build` before running the tests to ensure that the project is built correctly and the `dscom.exe` is available.\n\n3. **Writing Tests**  \n    We like to have unit tests 😊  \n    Write your own tests for any new features or bug fixes.\n\n4. **Verifying the tlb generation**  \n    To generate a TLB with dscom is the most important feature of this project.  \n    Compare the output of `dscom` with that of `tlbexp`.  \n    Use `scripts\\test.assembly.bat` to generate a TLB with both `dscom` and `tlbexp`, and compare the outputs.  \n    This script will use `src\\dscom.test.assembly\\dscom.test.assembly.csproj` to generate a TLB with both tools.\n  \n    The script will attempt to open VSCode to facilitate the file comparison.\n\n    Ensure tlbexp is installed on your machine.  \n    If you have Visual Studio installed, find tlbexp.exe in the `C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v10.0A\\bin\\NETFX 4.8 Tools` folder, or use the `Developer Command Prompt for VS` to run `tlbexp`.\n\nIf you have any questions, feel free to ask in the issues section.\n\nThank you for your contribution ❤️\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdspace-group%2Fdscom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdspace-group%2Fdscom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdspace-group%2Fdscom/lists"}