我有一个已注册com interop的dll,所以在HKLM\Software\Classes\CLSID [my guid]\InprocServer32 [my version no]\Codebase下它有已注册dll的路径.但是,我重新安排了我的文件夹结构,以便路径不再正确.有没有办法取消注册该DLL而不将其重新注册,然后取消注册,然后再次删除该文件?
如果我不再拥有该dll,或者只有一个具有不同版本号的那个,该怎么办?
我试图用VBScript中的C#编写一个方法.
我已经遵循了我在网上找到的所有说明,但仍然遇到问题.
具体来说,我得到了
错误:ActiveX组件无法创建对象
代码:800A01AD
到目前为止,我已经做了以下事情:
ComVisible(true) regasm /codebase 我的VBScript看起来像这样:
set oObject = CreateObject("TTTTTT.FFFFF.CCCCCCCCC")
Run Code Online (Sandbox Code Playgroud)
我的C#代码如下所示:
using System;
using System.IO;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace XXXXX.YYYYY
{
[ComVisible(true)]
[Guid("3EB62C37-79BC-44f7-AFBD-7B8113D1FD4F")]
[ProgId("TTTTTT.FFFFF.CCCCCCCCC")]
public class CCCCCCCCC
{
public void MyFunc()
{
//
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
当我使用regasm.exe注册我的.NET程序集时注册表项
HKEY_CLASSES_ROOT\CLSID {111E32AD-4BF8-495F-AB4D-6C61BD463EA4}\InprocServer32的
设置为"mscoree.dll".
但是,我试图模仿用C编写的现有COM服务器.当注册这个旧的COM服务器时,InprocServer32被设置为该组件的完整路径.
不幸的是,现有系统(我无法更改的插件主机)读取并使用此值 - "mscoree.dll"值会混淆.
我的解决方案可能是手动修补此注册表项 - 但我想了解为什么regasm将"mscoree.dll"写入InprocServer32.
如果您创建 COMClass,我注意到当您引用生成的 tlb 文件时,XML 摘要标记中的值不会显示在 VB6/VBA 的对象浏览器中。有没有办法让这些值显示出来?
这个问题是指来自heat.exe的输出.我正在尝试为MSI中的COM互操作注册一些.NET程序集做"正确的事情".Regasm.exe是错误的.
Rob Mensching说,直接调用regasm.exe很容易并且"大部分"工作,显然不是一个好主意.该博客文章解释了为什么它不是一个好主意,并提供了一个非常简单的解决方案.不幸的是,2004年的帖子暗示了一个现已弃用或不受支持的wix功能.我想,那里描述的解决方案不再有效,但该博客文章中提出的问题仍然存在.
显然,问题的"正确"解决方案是运行heat.exe然后"修复"目录引用等等.这听起来很简单,而且正是我想要做的.
好的,所以我正在努力做正确的事情.另外我不想GAC汇编,这意味着我必须使用codebase参数进行COM注册.heat.exe的输出包括以下内容:
<RegistryKey Root="HKCR" Key="CLSID\{xxx-GUID-HERE-xxx-xxx}\InprocServer32\1.2.3.4" >
<RegistryValue Name="Class" Value="My.DotNet.Classname.Here" Type="string" />
<RegistryValue Name="Assembly" Value="Strongname of .NET Assembly here" />
<RegistryValue Name="RuntimeVersion" Value="v2.0.50727" Type="string" />
<RegistryValue Name="CodeBase" Value="file:///[#fil4B562083D141F5A2F29E28A1BD09AF3E]" Type="string" />
</RegistryKey>
Run Code Online (Sandbox Code Playgroud)
第一个问题:究竟是Value="file:///[#fil4B562083D141F5A2F29E28A1BD09AF3E]"什么?
在我看来,fil4B562083D141F5A2F29E28A1BD09AF3E这是由Wix生成的Id; 该id属于.wxs文件中的File元素,该文件引用包含指定.NET类的程序集(DLL)的路径.现在,octothorpe到底是什么?和方括号?和file:/// 前缀?帮助我理解这种语法.
我问的原因 - 我不想使用这个ID.我已经有了一个文件ID,它反映了文件的实际含义,并不是那样的.
但是有问题的文件安装在不同的组件中.当我尝试引用该文件时,我得到了一堆这样的错误消息:
C:\dev\project\ComRegistration.wxs(397): warning LGHT1076: ICE69: Mismatched component reference.
Entry 'reg9652ABFDD2B970C523070996FE7BB510' of the Registry table belongs to
component 'C.ComRegistration'. However, the formatted string in column 'Value' references
file 'MyAssembly.dll' …Run Code Online (Sandbox Code Playgroud) 我有一个C++/CLI程序集(为Windows 7附带的.NET 3.5编译).程序集标记为ComVisible(true).它包含2个类和1个接口.这两个类都被标记为ComVisible(false)无关紧要.界面标有InterfaceType(ComInterfaceType::InterfaceIsIUnknown)特定的GUID.该接口需要注册.
当我尝试使用注册此程序集时RegAsm.exe AssemplyName,我收到此警告:
RegAsm : warning RA0000 : No types were registered
Run Code Online (Sandbox Code Playgroud)
我的程序集取决于与我的主程序集位于同一目录中的3个其他程序集.其中2个注册没有问题,第3个没有标记为ComVisible.
为什么我无法注册我的集会的任何想法?
我试图使用RegAsm注册.dll.它是一个.NET 2.0 DLL.所有课程都是公开的,ComVisible是真实的.我仍然得到RA0000:没有类型被注册错误.下面是代码和assemblyinfo.任何帮助都会很棒,谢谢!
STARTelnet.cs
/**
*Steven T. Norris Created: 3/27/2012
*Last Updated By: Steven T. Norris Last Updated On: 3/27/2012
*
*/
using System;
using MinimalisticTelnet;
using System.Net.Sockets;
/**
* @brief Used to connect to, read, and respond to a STAR terminal session.
*
* Steven T. Norris Created: 3/27/2012
*/
namespace STARTelnet
{
/**
* Class used to connect to, read, and respond to a STAR terminal session.
*/
public class STARConnection
{
private TelnetConnection conn;
private string output; …Run Code Online (Sandbox Code Playgroud) CodeProject有一个很棒的Windows shell扩展教程.
编译,运行Regasm.exe CSShellExtContextMenuHandler.dll /codebase和shell扩展可用,它工作得很好.
但要求用户运行Regasm不是用户友好的,所以我在下面编写了小的WiX脚本.(只是复制了输出heat,加上我想要使用的依赖DLL).
问题:当我安装生成的MSI时,不会出现shell扩展(在Windows资源管理器中,右键单击文件不显示我的项目,尽管它正在使用Regasm)
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
<Product Name='HelloWorld Shell Extension' Id='2afd44ab-16d7-40f4-8741-69ad546cb7cf' UpgradeCode='c5139d19-21ba-43c6-a17d-68760331f332'
Language='1033' Codepage='1252' Version='0.4.4' Manufacturer='Me'>
<Package Id='*' Keywords='Installer' Description="HelloWorld Shell Extension Setup" Manufacturer='Me'
InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />
<Media Id='1' Cabinet='HelloWorldShellExtension.cab' EmbedCab='yes' DiskPrompt='HelloWorld CAB' />
<Property Id='DiskPrompt' Value="HelloWorldShellExtension Bundle CAB Installation" />
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='INSTALLDIR' Name='HelloWorldShellExtension'>
<Component Id="cmpB0970E4FB9610FC20E1C6B6B2D45C606" Guid="7044db96-17d3-4d4f-93b0-135b89b042c8">
<Class Id="{CE43A2AB-B457-49BF-C83F-4306208D438B}" Context="InprocServer32" Description="CSShellExtContextMenuHandler.FileContextMenuExt" ThreadingModel="both" ForeignServer="mscoree.dll">
<ProgId Id="CSShellExtContextMenuHandler.FileContextMenuExt" …Run Code Online (Sandbox Code Playgroud) 我想在.net Core中构建COM对象,然后通过RegAsm注册。
我的.csproj文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp2.1;net4.7.2</TargetFrameworks>
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<Platforms>x64</Platforms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我的program.cs:
using System;
using System.Runtime.InteropServices;
namespace ComExample
{
[Guid("7ce1e40f-760a-4d81-b70b-61108ed15cb4")]
[ComVisible(true)]
public interface IComExampleClass
{
IComModelClass ExampleMethod(string param1, string param2);
}
[Guid("a8436b3f-3657-4a01-a133-fd333a84cb58")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class ComExampleClass : IComExampleClass
{
public IComModelClass ExampleMethod(string param1, string param2)
{
return new ComModelClass()
{
Result = $"{param1} + {param2}"
};
}
}
[Guid("9f5aeede-ec3e-443d-8ba0-9a9f2a6b9e53")]
[ComVisible(true)]
public interface IComModelClass
{
string Result { get; set; }
}
[Guid("526c6cb5-264d-4629-a894-fff02aeb9ec1")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class ComModelClass …Run Code Online (Sandbox Code Playgroud) 我编写了一个 .NET 程序集并使用 Regasm 在我的本地机器上成功注册了它,但是当我尝试在目标服务器中执行此操作时,出现以下错误。
Regasm:错误 RA0000:无法找到输入程序集“完整 dll 路径”或其依赖项之一。
我的本地机器是 Windows XP 32 位机器,服务器是 32 位 Windows 2003 Server。
我正在为 regasm 使用以下命令: Regasm "full file path" /tlb:filename.tlb
有谁知道我在这里想念什么?
谢谢。