lsu*_*rez 7 asp.net com-interop .net-4.0 visual-studio-2010 asp-classic
经过一系列不同的文章,没有找到任何特别结论,让我一步一步地完成整个过程,我来寻求帮助.
情景
我的客户只是精通ASP Classic的开发.他们最近为最初用ASP.NET编写的网站获得了一个帐户.他们将网站滚动到他们可以积极维护的东西,但该网站最初包括一个图像处理程序,该图像处理程序采用动态变化的水位数据并输出包含该数据的图形表示的图像.要求是开发一个COM互操作库,该库可以在服务器上注册并使用CreateObject调用,以使用Response.BinaryWrite生成相同图像的字节数组以进行输出.COM互操作库必须在Windows 2000 Server上的远程站点注册,我不能对他们有权访问regasm/gacutil来完成该任务做出任何假设.
难度
我通过在Visual Studio 2010中创建一个类库项目,从模板中选择"COM类",并插入我的代码来生成一个具有单个公共方法的类来构建类库,以便在给定整数时返回一个字节数组(好吧,普查员,但都是一样的).不幸的是,即使在我自己的开发机器上构建库并注册(regasm)和缓存程序集(gacutil)之后,我也无法通过Classic ASP调用实例化对象,而是接收" ActiveX组件无法创建"对象"错误.当然,在服务器站点,DLL文件无法注册,响应为"找不到必需的模块".
我用过的资源
我已经浏览了以下文章,并没有找到我需要的答案:
我需要的
基本上我需要的是一步一步掌握在Visual Studio 2010中正确地满足要求和正确创建COM +互操作模块的过程.创建实际的类对象本身并不是非常糟糕的难.
但是,我查看的文章中没有一篇真正讨论项目选项或使用Visual Studio 2010或.NET 4.0 Framework构建过程,如果对部署到Windows Server 2000等旧系统有特殊注意事项,也没有真正讨论过这些文章.以及只在手头有regsvr32的系统上实际注册库.
Pau*_*ney 12
将一个基本的.NET程序集暴露给COM应该是相当简单的 - 我从来没有尝试过COM类项目模板,所以这就是我过去管理它的方式:
使用C#或VB创建一个新的(沼泽标准).NET类库.定义COM接口(用您自己的GUID替换):
[ComVisible(true)]
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")]
public interface IComm
{
string GetMyGroups();
}
Run Code Online (Sandbox Code Playgroud)
现在定义一个实现该接口的类(同样,用您自己的GUID替换GUID):
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")]
[ProgId("Test.Comm.1")]
public class Comm : IComm
{
public string GetMyGroups()
{
var comm = new CommunicatorAPI.MessengerClass();
var groups = comm.MyGroups as IMessengerGroups;
return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
此类的Prog ID属性是用于从ASP实例化组件的内容.
强烈命名程序集(项目属性 - >"签名"选项卡 - >"签署程序集" - >使用下拉列表创建新的强名称密钥文件)
现在,构建程序集,并使用Regasm注册- 如果您不希望在GAC中注册(我建议,因为GACing不会使部署更简单),请务必使用-Codebase参数(这只是添加一个reg条目,告诉客户在哪里找到程序集) - 例如:
regasm ClassLibrary2.dll /codebase "S:\Testing\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll"
Run Code Online (Sandbox Code Playgroud)
现在你应该能够实例化组件,并在其上调用方法 - 例如(在javascript中):
var a = new ActiveXObject("Test.Comm.1");
alert(a.GetMyGroups());
Run Code Online (Sandbox Code Playgroud)
在部署方面,Regasm和Regsvr32所做的重要工作是将各种设置写入注册表,以便客户端可以找到COM组件(基于Prog ID或COM类ID).您需要做的就是在本地计算机上运行Regasm时计算出正在写入的COM设置,并将这些设置写入服务器上的注册表.您可以使用ProcMon监视运行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"
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
7871 次 |
| 最近记录: |