Изменить ProgID класса COM
Я создаю COM-компонент в C#. Когда он установлен, его ProgID представляется как <Namespace>.<Classname>
, Но я хочу изменить это на <Vendor>.<ClassName>.<VersionNumber>
,
Как я могу сделать это в C#. Я использую Visual Studio 2010.
2 ответа
MS утверждает:
ProgIds автоматически генерируются для класса путем объединения пространства имен с именем типа, разделенным точкой.
Это неправда, поскольку, по моему опыту, ProgIds объединены из имени проекта и класса. Поскольку пространство имен по умолчанию - это имя проекта, утверждение MS кажется верным, но если вы измените имя пространства имен, ProgId не изменится соответствующим образом.
М.С. продолжает:
Однако это может привести к неверному идентификатору ProgId, поскольку ProgId ограничен 39 символами и не может содержать никаких знаков препинания, кроме точки [я думаю: только одна точка]. В таком случае ProgId может быть вручную назначен классу с помощью атрибута ProgId.
Итак, мне кажется, что вы можете изменить только ProgId в таком случае, в обычных случаях установка ProgId бесполезна, это всегда будет ProjectName.ClassName.
В следующем примере я попробовал ProgId из Dietrich.Math.ClassName, выбрав Dietrich.Math в качестве имени проекта, но безуспешно: Dietrich.Math был изменен на Dietrich_Math. Как и ожидалось, атрибут ProgId игнорируется.NET, а ProgId по-прежнему имеет значение Dietrich_Math.Arithmetic.
using System;
using System.Runtime.InteropServices;
namespace Dietrich.Math
{
[ComVisible(true), Guid("B452A43E-7D62-4F11-907A-E2132655BF97")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IArithmetic
{
int Add(int a, int b);
}
[ComVisible(true), Guid("17A76BDC-55B7-4647-9465-3D7D088FA932")]
[ProgId("SimpleMath.Whatever")]
[ClassInterface(ClassInterfaceType.None)]
public class Arithmetic : IArithmetic
{
public int Add(int a, int b) { return a + b; }
}
}
Я думаю, что у пользователя @Bond была правильная идея. К сожалению @Bond не оставил пример. Вот пример использования ProgId...
using System;
using System.Runtime.InteropServices;
namespace EncryptionCOMTool
{
[ComVisible(visibility:true)]
[Guid(guid: "4a69e3ce-7cf8-4985-9b1a-def7977a95e7")]
[ProgId(progId: "EncryptionCOMTool.EncryptDecrypt")]
[ClassInterface(classInterfaceType: ClassInterfaceType.None)]
public class EncryptDecrypt
{
public EncryptDecrypt()
{
}
public string Encrypt(string input)
{
return "some encrypted value";
}
public string Decrypt(string input)
{
return "some decrypted value";
}
}
}
поскольку для атрибута ProgId требуется строка для ввода, вы можете разместить там все, что вам нравится, включая имя поставщика. Для обслуживания кода вы можете оставить ProgId таким же, как имя namespace.class. Чтобы сделать это, но используйте имя поставщика, вам нужно изменить пространство имен класса, включив в него имя поставщика, а для полноты также изменить пространство имен по умолчанию в свойствах проекта.