2017-03-21 1 views
0

COM interop을 노출하도록 만들어진 .NET 어셈블리가 있습니다. 간단한 코드 예제는 다음과 같습니다VBScript 내에서 .NET Uri를 사용하는 방법

namespace ClassLibraryWithUri 
{ 
    [ComVisible(true)] 
    public class UriGenerator 
    { 
     public UriGenerator() 
     { } 

     public Uri GetUri() 
     { 
      return new Uri("http://www.google.com"); 
     } 
    } 
} 

가 나는 비주얼 베이직 스크립트 내에서 소비하려고 :

dim myObj 
Set myObj = WScript.CreateObject("UriGenerator.UriGenerator") 
Dim myUri 
Set myUri = myObj.GetUri() 
Dim url 
Set url = myUri.ToString() 
WScript.Echo(url) 

하지만 오류 얻을 : 마이크로 소프트 VBScript 런타임 오류 : 개체가 필요 라인 Set url = myUri.ToString()

에서

내 질문은 : 왜? 우리는 지원됩니까? 구글과 스택 OVerflow에 아무것도 찾지 못했습니다 내가 잘못하고 있니?

도움 주셔서 감사합니다.

+0

이 그것을 반환하기 전에'string'에'Uri' 변환하려고합니다. – Lankymart

+0

답해 주셔서 감사합니다. 그 유감. 저는 .NET 개발자들에게 더 나은 경험을 제공하기 위해 string을 Uri로 대체했습니다. C++에서 시도해도 똑같이 적용될 것 같습니까? 어떤 종류의 COM interop 문서가 있습니까? – peval27

+0

가장 좋은 방법은'regedit.exe '를 사용하여'CreateObject'가 사용하는'progid'와 관련된'HKEY_CLASS_ROOT'에서 레지스트리를 찾는 것입니다. – Lankymart

답변

0

이 기능을 사용하려면 .NET의 Uri 클래스 용 COM 래퍼 클래스를 만들어야한다고 생각합니다. 내가 취할 수있는 노력에 대해 궁금해서 다음과 같이 썼다. 이것은 당신이해야 할 일입니다. 공용 인터페이스에서 URI를 사용하려는 모든 곳에서는 아래 정의 된대로 IUri을 사용하십시오. 은`Uri` 클래스가 COM을 통해 노출되지 않기 때문에 그것은있을 것

// COM doesn't have constructors, so in order to create Url objects from COM clients, you need a factory 
[ComVisible(true)] 
public interface IUriFactory 
{ 
    IUri Create1(string uriString); 
    IUri Create2(string uriString, UriKind uriKind); 
    IUri Create3(IUri baseUri, string relativeUri); 
    IUri Create4(IUri baseUri, IUri relativeUri); 
} 

[ComVisible(true)] 
public interface IUri 
{ 
    string GetComponents(UriComponents components, UriFormat format); 
    string GetLeftPart(UriPartial part); 
    bool IsBaseOf(IUri uri); 
    bool IsWellFormedOriginalString(); 
    IUri MakeRelativeUri(IUri uri); 
    string ToString(); 
    string AbsolutePath { get; } 
    string AbsoluteUri { get; } 
    string Authority { get; } 
    string DnsSafeHost { get; } 
    string Fragment { get; } 
    string Host { get; } 
    UriHostNameType HostNameType { get; } 
    bool IsAbsoluteUri { get; } 
    bool IsDefaultPort { get; } 
    bool IsFile { get; } 
    bool IsLoopback { get; } 
    bool IsUnc { get; } 
    string LocalPath { get; } 
    string OriginalString { get; } 
    string PathAndQuery { get; } 
    int Port { get; } 
    string Query { get; } 
    string Scheme { get; } 
    string[] Segments { get; } 
    bool UserEscaped { get; } 
    string UserInfo { get; } 
} 

[ComVisible(true)] 
public enum UriKind 
{ 
    RelativeOrAbsolute = System.UriKind.RelativeOrAbsolute, 
    Absolute = System.UriKind.Absolute, 
    Relative = System.UriKind.Relative, 
} 

[ComVisible(true)] 
public enum UriComponents 
{ 
    Scheme = System.UriComponents.Scheme, 
    UserInfo = System.UriComponents.UserInfo, 
    Host = System.UriComponents.Host, 
    Port = System.UriComponents.Port, 
    Path = System.UriComponents.Path, 
    Query = System.UriComponents.Query, 
    Fragment = System.UriComponents.Fragment, 
    StrongPort = System.UriComponents.StrongPort, 
    NormalizedHost = System.UriComponents.NormalizedHost, 
    KeepDelimiter = System.UriComponents.KeepDelimiter, 
    SerializationInfoString = System.UriComponents.SerializationInfoString, 
    AbsoluteUri = Fragment | Query | Path | Port | Host | UserInfo | Scheme, 
    HostAndPort = StrongPort | Host, 
    StrongAuthority = HostAndPort | UserInfo, 
    SchemeAndServer = Port | Host | Scheme, 
    HttpRequestUrl = SchemeAndServer | Query | Path, 
    PathAndQuery = Query | Path, 
} 

[ComVisible(true)] 
public enum UriFormat 
{ 
    UriEscaped = System.UriFormat.UriEscaped, 
    Unescaped = System.UriFormat.Unescaped, 
    SafeUnescaped = System.UriFormat.SafeUnescaped, 
} 

[ComVisible(true)] 
public enum UriPartial 
{ 
    Scheme = System.UriPartial.Scheme, 
    Authority = System.UriPartial.Authority, 
    Path = System.UriPartial.Path, 
    Query = System.UriPartial.Query, 
} 

[ComVisible(true)] 
public enum UriHostNameType 
{ 
    Unknown = System.UriHostNameType.Unknown, 
    Basic = System.UriHostNameType.Basic, 
    Dns = System.UriHostNameType.Dns, 
    IPv4 = System.UriHostNameType.IPv4, 
    IPv6 = System.UriHostNameType.IPv6, 
} 

[ComVisible(true)] 
public class UriFactory : IUriFactory 
{ 
    public IUri Create1(string uriString){ return new Uri(new System.Uri(uriString)); } 
    public IUri Create2(string uriString, UriKind uriKind) { return new Uri(new System.Uri(uriString, (System.UriKind) (int) uriKind)); } 
    public IUri Create3(IUri baseUri, string relativeUri) { return new Uri(new System.Uri(((Uri) baseUri).Inner, relativeUri)); } 
    public IUri Create4(IUri baseUri, IUri relativeUri) { return new Uri(new System.Uri(((Uri) baseUri).Inner, ((Uri) relativeUri).Inner)); } 
} 

[ComVisible(true)] 
internal class Uri : IUri 
{ 
    internal readonly System.Uri Inner; 
    internal Uri(System.Uri inner) { Inner = inner; } 
    public string GetComponents(UriComponents components, UriFormat format) => Inner.GetComponents((System.UriComponents) components, (System.UriFormat) format); 
    public string GetLeftPart(UriPartial part) => Inner.GetLeftPart((System.UriPartial) part); 
    public bool IsBaseOf(IUri uri) => Inner.IsBaseOf(((Uri) uri).Inner); 
    public bool IsWellFormedOriginalString() => Inner.IsWellFormedOriginalString(); 
    public IUri MakeRelativeUri(IUri uri) => new Uri(Inner.MakeRelativeUri(((Uri) uri).Inner)); 
    public string AbsolutePath => Inner.AbsolutePath; 
    public string AbsoluteUri => Inner.AbsoluteUri; 
    public string Authority => Inner.Authority; 
    public string DnsSafeHost => Inner.DnsSafeHost; 
    public string Fragment => Inner.Fragment; 
    public string Host => Inner.Host; 
    public UriHostNameType HostNameType => (UriHostNameType) (int) Inner.HostNameType; 
    public bool IsAbsoluteUri => Inner.IsAbsoluteUri; 
    public bool IsDefaultPort => Inner.IsDefaultPort; 
    public bool IsFile => Inner.IsFile; 
    public bool IsLoopback => Inner.IsLoopback; 
    public bool IsUnc => Inner.IsUnc; 
    public string LocalPath => Inner.LocalPath; 
    public string OriginalString => Inner.OriginalString; 
    public string PathAndQuery => Inner.PathAndQuery; 
    public int Port => Inner.Port; 
    public string Query => Inner.Query; 
    public string Scheme => Inner.Scheme; 
    public string[] Segments => Inner.Segments; 
    public bool UserEscaped => Inner.UserEscaped; 
    public string UserInfo => Inner.UserInfo; 
} 
+0

그게 분명히 가능합니다, 도와 주셔서 감사합니다 – peval27

+0

이 코드를 사용하여 행운을 빕니다? –

+0

질문 해 주셔서 감사합니다. 문자열 (Uri.ToString() 사용)을 반환하는 대체 메서드를 제공하기로했습니다. Uri를 반환하는 메서드는 COM이 표시되지 않습니다. 그것은 많은 코드를 추가하는 것보다 쉬워 보였습니다. – peval27

관련 문제