Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用4.0框架和Visual Studio 2010为ASP Classic构建COM互操作库_Asp.net_Visual Studio 2010_.net 4.0_Asp Classic_Com Interop - Fatal编程技术网

Asp.net 使用4.0框架和Visual Studio 2010为ASP Classic构建COM互操作库

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服务器的远程站点上

在阅读了许多不同的文章,没有找到任何特别的结论,使我一步一步地通过这个过程,我来寻求帮助

场景

我的一个客户只精通开发。他们最近获得了一个最初用ASP.NET编写的站点的帐户。他们正在将该站点滚动到可以主动维护的位置,但该站点最初包含一个图像处理程序,该处理程序获取动态变化的水位数据,并输出包含该数据图形表示的图像。需求是开发一个互操作库,该库可以在服务器上注册,并使用CreateObject调用,以生成相同图像的字节数组,以便使用。COM互操作库必须在Windows 2000服务器的远程站点上注册,我不能假设他们可以访问regasm/gacutil来完成该任务

难度

我在Visual Studio 2010中创建了一个类库项目,从模板中选择“COM类”,并插入代码生成一个类,该类使用一个公共方法在给定整数时返回一个字节数组(枚举数,但都是一样的)。不幸的是,即使在我自己的开发机器上,在构建库并注册(regasm)和缓存程序集(gacutil)之后,我也无法通过经典ASP调用来实例化对象,而是收到一个“组件无法创建对象”错误。当然,在服务器站点上,无法注册DLL文件,响应为“未找到必需的模块”

我使用过的资源

我已经浏览了以下文章,还没有找到我需要的答案:

  • (基本步骤)
  • 我需要什么

    基本上,我需要的是一步步掌握在VisualStudio2010中满足需求和正确创建互操作模块所需的内容。创建实际的类对象本身并不十分困难


    但是,我看过的文章中没有一篇真正讨论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(以管理员身份运行)
    • 创建一个新的“类库”项目
    • 命名为:“网络公司”
    [02]C#

    • 添加一个新类,将其命名为“HelloCOM”
    • 使用以下代码作为起始模板
    (有关更多信息,请访问)

    [02]VB.NET

    • 添加一个新的“COM类”,将其命名为“HelloCOM”
    • VB.NET创建起始模板
    • 将以下函数添加到“HelloCOM”类中

    [03]C#

    • 打开项目属性
    • 进入“申请”
    • 单击“装配信息…”
    • 选中“使组件COM可见”
    • 转到“构建”
    • 选择“平台目标:x86”
    • 选中“为互操作注册COM”
    [03]VB.NET

    • 打开“MyProject”
    • 转到“编译”
    • 选择“目标CPU:x86”
    [04]

    • 构建“DotNetCom.dll”
    [05]

    • 打开命令提示符(以管理员身份运行)
    • 将目录更改为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"
      
    [06]

    • 启动组件服务
    • 添加新的COM+应用程序
    • 把它命名为“网络公司”
    • 打开“DotNetCom”属性
    • 转到“安全选项卡”
    • 取消选中“强制此应用程序的访问检查”
    [07]

    • 添加一个新组件
    • 选择“DotNetComTest.tlb”(不要选择“DotNetComTest.dll”)
    [08]

    • 使用经典ASP页面中的COM对象

      <%
      Dim HelloCOM
      Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM")
      Response.Write HelloCom.Hello
      %>
      
      
      

    非常感谢。COM类包装器是由VS2010中的模板处理的,所以这一部分至少很方便。我在过去的构建中也处理过强名称键,因为很多评论/文章都提到它是必需的。我认为这种区别
    [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
    %>