1

(PInvoke 経由で) 管理されていない DLL を内部的に呼び出す、昔ながらの ASMX WebService (WCF ではない) を使用しています。例外は発生しませんが、期待どおりに動作しません。通常の WinForms アプリケーションの同じコードは問題なく動作します。

VisualStudioでWebServiceをデバッグするときの作業ディレクトリが原因だと思います。作業ディレクトリは C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0 で、管理されていない DLL が見つからないと思います。しかし、私のプロジェクトの \bin フォルダーには、すべての DLL があります。

それに応じてサービスを構成する方法はありますか、それとも特別なアクセス権が必要ですか?

PS:初心者の質問で申し訳ありません。

コードの一部を次に示します。

最初: サービスは、レーザー プロジェクターによって投影されるいくつかのベクトル グラフィックを受け入れます。

[WebService(Namespace = "http://www.myDomain.eu/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class BeamerService : System.Web.Services.WebService
{
    [WebMethod]
    public void ShowBounds()
    {
        // ToDo: construct some graphics

        // ToDo: get laser/DAC
        DAC dac;
        if (!Laser.DAC.TryInitializeAny(out dac))
        {
            // DAC not connected
            return;
        }

        // ToDo: send graphics to DAC

2 番目: USB 経由でコンピューターに接続されているレーザー デバイスにアクセスします。

    public static bool TryInitializeAny(out DAC dac)
    {
        return UniversalDAC.TryInitialize(ControllerTypes.Netlase, ControllerType.Netlase, out dac);
    }

3番目:管理されていないDLL(私のものではない)を使用して、接続されているデバイスを検索し、最初のデバイスを取得します。"DrLava" で始まるすべての行は、アンマネージ コードへの P.Invoke 呼び出しです。

    public static bool TryInitialize(ControllerTypes types, ControllerType type, out DAC dac, DeviceChooser deviceChooser = null)
    {
        try
        {
            uint deviceCount = 0;
            if (DrLava.LDL_Init((uint)ConvertToNativeMask(types), ref deviceCount) != NativeConstants.DAC_OK)
                throw new ArgumentException(string.Format("Could not intialize DAC with '{0}'", type));

            uint device = deviceChooser == null ? 0 : deviceChooser(deviceCount);

            uint tType = 0;
            uint tEnum = 0;
            var sName = new StringBuilder(128);
            if (DrLava.LDL_GetDACInfo(device, sName, (uint)sName.Length, ref tType, ref tEnum) != NativeConstants.DAC_OK)
                throw new ArgumentException(string.Format("Could retriev name of DAC device number {0} with '{1}'.", device, type));

            if (DrLava.LDL_DAC_Init(device) != NativeConstants.DAC_OK)
                throw new ArgumentException(string.Format("Could not intialize DAC with '{0}' using device number {1}", type, device));

            dac = new UniversalDAC(type, sName.ToString(), device);

            return true;
        }
        catch (Exception ex)
        {
            Trace.Error("Could not initialize DAC.Instance with '{0}'. {1}", type, ex);
        }

        dac = null;
        return false;
    }

問題はステップ 3 にあります。コンソールまたは WinForms アプリケーションでコードを実行すると、接続されている USB が検出され、使用できます。WebService で同じコードを実行すると、手順 3 の最初の行 (DrLava.LDL_Init) で結果が得られません。

4

0 に答える 0