Asp.net 使用4.0框架和Visual Studio 2010为ASP Classic构建COM互操作库
在阅读了许多不同的文章,没有找到任何特别的结论,使我一步一步地通过这个过程,我来寻求帮助 场景 我的一个客户只精通开发。他们最近获得了一个最初用ASP.NET编写的站点的帐户。他们正在将该站点滚动到可以主动维护的位置,但该站点最初包含一个图像处理程序,该处理程序获取动态变化的水位数据,并输出包含该数据图形表示的图像。需求是开发一个互操作库,该库可以在服务器上注册,并使用CreateObject调用,以生成相同图像的字节数组,以便使用。COM互操作库必须在Windows 2000服务器的远程站点上注册,我不能假设他们可以访问regasm/gacutil来完成该任务 难度 我在Visual Studio 2010中创建了一个类库项目,从模板中选择“COM类”,并插入代码生成一个类,该类使用一个公共方法在给定整数时返回一个字节数组(枚举数,但都是一样的)。不幸的是,即使在我自己的开发机器上,在构建库并注册(regasm)和缓存程序集(gacutil)之后,我也无法通过经典ASP调用来实例化对象,而是收到一个“组件无法创建对象”错误。当然,在服务器站点上,无法注册DLL文件,响应为“未找到必需的模块” 我使用过的资源 我已经浏览了以下文章,还没有找到我需要的答案:Asp.net 使用4.0框架和Visual Studio 2010为ASP Classic构建COM互操作库,asp.net,visual-studio-2010,.net-4.0,asp-classic,com-interop,Asp.net,Visual Studio 2010,.net 4.0,Asp Classic,Com Interop,在阅读了许多不同的文章,没有找到任何特别的结论,使我一步一步地通过这个过程,我来寻求帮助 场景 我的一个客户只精通开发。他们最近获得了一个最初用ASP.NET编写的站点的帐户。他们正在将该站点滚动到可以主动维护的位置,但该站点最初包含一个图像处理程序,该处理程序获取动态变化的水位数据,并输出包含该数据图形表示的图像。需求是开发一个互操作库,该库可以在服务器上注册,并使用CreateObject调用,以生成相同图像的字节数组,以便使用。COM互操作库必须在Windows 2000服务器的远程站点上
但是,我看过的文章中没有一篇真正讨论Visual Studio 2010或.NET 4.0 Framework的项目选项或构建过程,也没有任何一篇真正讨论部署到Windows Server 2000等较旧系统时是否有特殊注意事项,以及在仅使用,比如说,在手上。将基本的.NET程序集公开给COM应该相当简单-我从未尝试过COM类项目模板,所以我过去管理它的方式是这样的: 使用C#或VB创建一个新的(bog标准).NET类库。定义COM接口(用自己的GUI替换): 现在定义一个实现该接口的类(同样,用自己的guid替换guid): 现在,您应该能够实例化组件,并对其调用方法-例如(在javascript中): 在部署方面,Regasm和Regsvr32所做的重要工作是将各种设置写入注册表,以便客户端可以找到COM组件(基于Prog ID或COM类ID)。您所需要做的就是计算出在本地计算机上运行Regasm时写入的COM设置,然后将这些设置写入服务器上的注册表。您可以使用监视运行Regasm时写入注册表的内容 一般来说,您可以看到这样的内容写入注册表:
[HKEY_CLASSES_ROOT\Test.Comm.1]
@="ClassLibrary2.Comm"
[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID]
@="{00585504-90C8-4760-A359-67CAF08FFED1}"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}]
@="ClassLibrary2.Comm"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0]
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId]
@="Test.Comm.1"
希望这有帮助:)我有一个使用VB6 COM对象的经典ASP网站。我想用.NET而不是VB6创建COM对象的新版本。我就是这样做的(希望这有帮助)。我包括了C#和VB.NET的说明 [01]
- 启动Visual Studio 2015(以管理员身份运行)
- 创建一个新的“类库”项目
- 命名为:“网络公司”
- 添加一个新类,将其命名为“HelloCOM”
- 使用以下代码作为起始模板
- 添加一个新的“COM类”,将其命名为“HelloCOM”
- VB.NET创建起始模板
- 将以下函数添加到“HelloCOM”类中
- 打开项目属性
- 进入“申请”
- 单击“装配信息…”
- 选中“使组件COM可见”
- 转到“构建”
- 选择“平台目标:x86”
- 选中“为互操作注册COM”
- 打开“MyProject”
- 转到“编译”
- 选择“目标CPU:x86”
- 构建“DotNetCom.dll”
- 打开命令提示符(以管理员身份运行)
- 将目录更改为dll
cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug
- 运行RegAsm/codebase
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm DotNetComTest.dll /codebase "C:\DotNetComTest\DotNetComTest\bin\Debug\DotNetComTest.dll"
- 启动组件服务
- 添加新的COM+应用程序
- 把它命名为“网络公司”
- 打开“DotNetCom”属性
- 转到“安全选项卡”
- 取消选中“强制此应用程序的访问检查”
- 添加一个新组件
- 选择“DotNetComTest.tlb”(不要选择“DotNetComTest.dll”)
- 使用经典ASP页面中的COM对象
<% Dim HelloCOM Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM") Response.Write HelloCom.Hello %>
[HKEY_CLASSES_ROOT\Test.Comm.1]
@="ClassLibrary2.Comm"
[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID]
@="{00585504-90C8-4760-A359-67CAF08FFED1}"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}]
@="ClassLibrary2.Comm"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0]
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId]
@="Test.Comm.1"
using System.Runtime.InteropServices;
namespace DotNetCom
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface HelloCOMInterface
{
[DispId(1)]
string Hello();
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface HelloCOMEvents
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(HelloCOMEvents))]
public class HelloCOM : HelloCOMInterface
{
public string Hello()
{
return "Hello there!";
}
}
}
Public Function Hello() As String
Return "Hello there!"
End Function
cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm DotNetComTest.dll /codebase "C:\DotNetComTest\DotNetComTest\bin\Debug\DotNetComTest.dll"
<%
Dim HelloCOM
Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM")
Response.Write HelloCom.Hello
%>