(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) で結果が得られません。