我正在使用老式的ASMX WebService(而不是WCF),它在内部调用非托管DLL(通过PInvoke)。我没有得到任何例外,但它没有按预期工作。常规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
第二:访问通过USB连接到计算机的激光设备。
public static bool TryInitializeAny(out DAC dac)
{
return UniversalDAC.TryInitialize(ControllerTypes.Netlase, ControllerType.Netlase, out dac);
}
第三次:使用非托管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)将不会产生任何结果。