.NET - vytvoření COM objektu rubrika: Programování: .Net

7 pilif
položil/-a 6.1. 17:19

Zdravím ve spolek,
podle příkladu z CodeProject se pokouším vygenerovat jednoduchou DLL knihovnu nastavenou jako COM object - volba "Make assembly COM-Visible".
Knihovnu buildnu, následně zaregistruji pomocí

regasm TestCOM.dll /tlb:TestCOM.tlb

a poté se jí pokusím použít pomocí powershel skriptu:

$x = New-Object -com TemperatureComponent

...ihned po provedení tohoto příkazu dostanu chybu:

Retrieving the COM class factory for component with CLSID {52645F0F-CBEA-3398-9B82-DD45EA0B6E5B} failed due to the following error: 80040154 Class not registered (E
xception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). (raised by: New-Object)

V čem mám chybu?
Zde C#/.NET kód DLL knihovny:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
public enum WeatherIndications
{
    Sunny = 0, Cloudy,
}
 
[ClassInterface(ClassInterfaceType.AutoDual)]
public class TemperatureComponent
{
    public TemperatureComponent()
    {
        Temperature = 30.0f;
    }
 
    public float Temperature { get; set; }
 
    public void DisplayCurrentTemperature()
    {
        String strTemp = String.Format("The current temperature at Marlinspike is : {0:####} degrees fahrenheit", Temperature);
        MessageBox.Show(strTemp, "Today's Temperature");
    }
 
    public WeatherIndications GetWeatherIndications()
    {
        return Temperature > 70 ? WeatherIndications.Sunny : WeatherIndications.Cloudy;
    }
}
odkaz Vyřešeno
2 p.hlavacek
odpověděl/-a 10.1. 23:09

Regasm nepíše do registru plnou cestu k assembly (dll která obsahuje com objekt), ale pouze její strong name.
Když tedy v powershellu vytváříte objekt, runtime hledá podle zadaného strongname a snaží assembly najit.
Hledá ji v adresáři, odkud je spuštěn powershell a v global assembly cache. Pokud ji nenajde, dopadne to jak píšete.
Reseni jsou 3

  1. Nakoporovat vasi dll k powershellu
  2. Vložit vasi dll do gac
  3. Udělat registraci s celou cestou (/codebase)

Jinak pro troubleshooting doporučuji zapnout fusion log

Komentáře

  • pilif : Díky, tak codebase pomohlo. 11.1. 18:32

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.