代码之家  ›  专栏  ›  技术社区  ›  Peter

从Office2003执行.NET 3.0代码

  •  8
  • Peter  · 技术社区  · 15 年前

    我使用.NET 3.0框架在C_中创建了一个DLL。

    以下是我的DLL代码

    namespace CompanyName.Net
    {
        [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")]
        [ClassInterface(ClassInterfaceType.AutoDual)]
        [ProgId("CompanyName.Net.Webrequest")]
        public class WebRequest
        {
            public string Result { get; private set; }
            public string Url { get; set; }
            public string StatusDescription { get; private set; }
            public HttpStatusCode StatusCode { get; private set; }
    
            public WebRequest()
            {
                //explicit constructor
            }    
    
            public string GetResponse(string url)
            {
                System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse) webreq.GetResponse();
                // Store the status.
                StatusDescription = response.StatusDescription;
                StatusCode = response.StatusCode;
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                // Open the stream using a StreamReader for easy access.
                StreamReader reader = new StreamReader(dataStream);
                // Read the content.
                Result = reader.ReadToEnd();
                // Cleanup the streams and the response.
                reader.Close();
                dataStream.Close();
                response.Close();
                //return the response
                return Result;
            }
        }
    }
    

    我正在尝试从Office2003 VBA代码运行此代码。该dll是使用默认的Visual Studio 2008签名进行签名的。

    我已经通过创建一个.tlb文件来引用我的程序集

    regasm /tlb c:\CompanyName.Net.dll 
    

    但当我要创建对象的实例时:

    Private Sub Command0_Click()
        Dim o As Object
        Set o = CreateObject("CompanyName.Net.WebRequest")
        Dim s As String
        s = o.GetResponse("http://www.google.be")
        MsgBox s
    End Sub
    

    我得到以下错误:

    ActiveX组件无法创建对象

    我做错什么了?

    我正在测试的机器安装了.NET到.NET 3.5框架。

    2 回复  |  直到 12 年前
        1
  •  10
  •   Gaffi jusathr    12 年前

    好吧,在托尔斯滕·迪特马尔提出了一些很好的想法之后,我终于把这件事做好了。 在我们的讨论中出现的一些事情和我在网上发现的其他事情:

    1. .NET框架需要安装在目标计算机上。
    2. .NET可编程性支持需要安装在目标计算机上。
    3. 在assemblyinfo.cs中确保设置

      [组件:ComVisible( )

    4. 正如Thorsten指出的那样,在.NET类中需要有无参数的公共构造函数。

    5. 确保在项目的“属性”页上的“生成”选项卡中选中“注册COM互操作”。
    6. 确保使用项目“属性”页上的“签名”选项卡对项目进行签名。
    7. 通过运行此命令在目标计算机上注册DLL。这个 /代码库 参数似乎对我有帮助。类型库(.tlb)或dll的路径无关紧要。您可以在c:\windows\microsoft.net\framework\v2.050727\regasm.exe中找到regasm。

      regasm c:\companyname.net.dll/tlb:companyname.net.tlb /代码库

    8. 使用“工具”>“引用”在VBA编辑器中引用.tlb文件。

    9. 将dll从c:\拖动到位于c:\windows\assembly的GAC\ (我一开始没有意识到这一点,但显然办公室有必要找到你们的集会。)

    这应该能解决问题。

    我还通过为WebRequest类添加接口来升级它,从而启用 IntelliSense 支持vb6(很遗憾,这在vba中不起作用)。

        2
  •  2
  •   Thorsten Dittmar    15 年前

    在COM类中需要显式的无参数构造函数。将类定义更改为:

    namespace CompanyName.Net
    {
        [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")]
        [ClassInterface(ClassInterfaceType.AutoDual)]
        [ProgId("CompanyName.Net.Webrequest")]
        public class WebRequest
        {
            public string Result { get; private set; }
            public string Url { get; set; }
            public string StatusDescription { get; private set; }
            public HttpStatusCode StatusCode { get; private set; }
    
            public WebRequest()
            {
            }
    
            public string GetResponse(string url)
            {
                System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse) webreq.GetResponse();
                // Store the status.
                StatusDescription = response.StatusDescription;
                StatusCode = response.StatusCode;
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                // Open the stream using a StreamReader for easy access.
                StreamReader reader = new StreamReader(dataStream);
                // Read the content.
                Result = reader.ReadToEnd();
                // Cleanup the streams and the response.
                reader.Close();
                dataStream.Close();
                response.Close();
                //return the response
                return Result;
            }
        }
    }
    

    这应该有效。