2010-09-14 15 views
5

Aşağıda verilen C# içindeki otomasyon uyumlu COM kitaplığını düşünün. IFoo türünde bir nesne oluşturan ICreateFoos'u uygulayan görünür bir fabrika sınıfının FooFactory'a sahip ortak bir COM modelini izler. FooFactory, tür kitaplığındaki yalnızca sınıf sınıftır. (Fabrika modeli, parametreli yapıcılar için izin vermediği için COM ile özellikle kullanışlıdır). Aşağıdaki kodda Bu C# COM sınıfı neden VBScript'den kullanılabilir, ancak JScript değil?

, ben yorumladı satırları uncommenting ( FooImpl sınıf ComVisible yapmak sürece jscript döndü IFoo arayüzüne erişmek olamayacağını buluyorum; bu da bir coclass olarak görünmesine neden olur tür kitaplığı). VBscript'dan buna benzer bir sorun yok. olduğu

, bu VBScript çalışabilir:

set ff = CreateObject("jstest.FooFactory") 
set foo = ff.CreateFoo(0) 
foo.Foo 

Ancak bu işlevsel olarak aynı JScript hata "Cı ile, başarısız: \ temp \ jstest \ jstest.js (4 1) Microsoft JScript® Çalışma zamanı hatası: 'foo' "null veya bir nesne değil:

var ff = new ActiveXObject("jstest.FooFactory"); 
var foo = ff.CreateFoo(0) 
//WScript.Stdout.WriteLine(null==foo) 
foo.Foo(); 

çizgiyi yorumsuz, bunu boş == foo yanlıştır görebilirsiniz.

Bu neden oluyor? Bu bir hata mı? Bu sorunun bir JScript ve C#/net-özel uygulamasının (muhtemelen IDispatch) bir bileşimi olduğunu düşünüyorum, çünkü bu soruna JScript'ten gelmeyen başka benzer COM sunucularına - C++ uygulamasında - sahip olduğum için.

Aşağıdaki kodda yorumlanmış satırları görmezden geldiğimde, FooImpl'i bir sınıf olarak görünür hale getirdiğimde sorun gideriliyor, ancak özellikle uygulama ayrıntılarını göstermek istemediğim gibi bunu yapmak istemiyorum. Bir geçici çözüm, FooImpl ComVisible yapmak, ancak müşterilerini CoCreate yapabilmelerini engelleyen yapıcısını dahili olarak işaretlemek gibi görünüyor, ancak bu pek de zarif değil.

Visual Studio 2005, .net 2 ile WinXP SP3 üzerinde çalışıyorum ve bir VirtualBox'ta (hem Windows Komut Dosyası Ana Bilgisayarı 5.7 ile) tamamen yeni bir TinyXP yüklemesiyle ilgili sorunu yeniden üretebildim ve ayrıca Windows 7 Ultimate. Net SDK 2.0, 3.0, 3.5 ve 4.0 (WSH 5.8) kullanarak. Tüm işletim sistemleri 32-bit idi.

kütüphane kodu:

using System; 
using System.Runtime.InteropServices; 

[assembly: ComVisible(false)] 

namespace jstest 
{ 
    [ComVisible(true)] 
    public interface ICreateFoos 
    { 
     IFoo CreateFoo(int importantNumber); 
    } 

    [ComVisible(true)] 
    public interface IFoo 
    { 
     void Foo(); 
    } 

    [ComVisible(true)] 
    public class FooFactory : ICreateFoos 
    { 
     public IFoo CreateFoo(int importantNumber) 
     { // in *this* version, we don't use importantNumber yet 
      return new FooImpl(); 
     } 
    } 

    //[ComVisible(true)] 
    public class FooImpl : IFoo 
    { 
     public void Foo() 
     { 
      Console.WriteLine("Foo"); 
     } 
    } 
} 

Sen derleyip kayıt olabilirsiniz IFoo nesne dönen karşı Queryınterface çağrıldığında

csc /target:library jstest.cs 
regasm /codebase jstest.dll 
+0

BTW - lütfen bu sorunu yeniden oluşturmaya çalışmışsanız ve başarılı/başarısız olmuşsanız yorum yapın. – bacar

+0

VS2010 (C# express) ve Windows XP SP3 ile çoğaltılmıştır. – arx

cevap

İlgili konular