每当我尝试运行具有应用程序洞察力和实体框架的webjob项目时,我都会收到此错误.
System.IO.FileLoadException:'无法加载文件或程序集'System.Runtime.InteropServices.RuntimeInformation,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)'
我安装了以下nuget包
Microsoft.Azure.WebJobs.Logging.ApplicationInsights版本2.1.0-beta4
Microsoft.Extensions.Logging版本2.0.0
Microsoft.Extensions.Logging.Console版本2.0.0.
这一切都适用于一个新的Visual Studio 2017 webjob项目,当我尝试包含现有的代码库时,主要使用实体框架,我得到了这个错误.当我查看工作中的引用时,我没有System.Runtime.InteropServices.RuntimeInformation,但它已经添加到具有实体框架的项目中.它似乎是.net标准的一部分,但为什么我的新控制台应用程序不需要.net标准!
我不确定它为什么寻找版本0.0.0.0,因为我的版本是4.0.2.0
我也尝试将其添加到项目文件中,但这不起作用.
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
非常感谢
我正试图在我的VB.NET应用程序中使用C编码的其他人的DLL.我的VB.NET应用程序发送一些指向DLL和DLL的回调指针,然后回调我的VB.NET应用程序内的函数.
DLL在VB.NET中调用一个函数并传递一个C结构的指针.我的VB.NET应用程序必须修改struct值,因此DLL可以使用新的struct值.我不能修改DLL的代码,因为它是别人的DLL.
typedef struct {
uint8_t index;
uint8_t value;
uint8_t leds[4];
struct {
int8_t x;
int8_t y;
int8_t z;
} input[10];
} REPORT;
Run Code Online (Sandbox Code Playgroud)
我的VB.NET结构定义是
<StructLayout(LayoutKind.Sequential)> _
Public Structure INPUTS
Public x As SByte
Public y As SByte
Public z As SByte
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure REPORT
Public index As Byte
Public value As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)>
Public leds() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)>
Public input() As INPUTS
Sub New(numleds As Integer, numinputs As Integer)
ReDim Me.leds(numleds)
ReDim Me.input(numinputs)
End …Run Code Online (Sandbox Code Playgroud) 我有一个需要通过 c# 访问的自定义 dll(未注册)。如何在不注册 DLL 的情况下执行此操作?
编辑:它是一个 C++ dll。
按照此链接,我在我的 C# 解决方案中实现了WTSQueryUserToken并CreateProcessAsUserWrapper.LaunchChildProcess("app_path")从OnStart我的 Windows 服务中调用了该方法,该方法作为“LocalSystem”运行。它能够启动可以与桌面交互的进程,但适用于 Windows Professional 而不适用于 Windows Ultimate。我在 Windows Professional 64 位上尝试过,它能够以交互方式在用户登录时成功启动进程,但在 Windows Ultimate 64 位版本上,该CreateProcessAsUser方法返回 false并且可以看到服务正在运行,SCM而进程则没有。
我的进程是一个 win 表单应用程序,它需要使用当前登录的用户帐户运行以进行桌面交互,并使用InteropServices. 会不会是框架问题?如何解决问题?请帮忙。
编辑:
两台机器都运行 Windows 7 64 位。我下面的代码添加后,出现错误代码CreateProcessAsUser,并返回“请求的操作需要提升”的错误。
string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
Run Code Online (Sandbox Code Playgroud)
它仅发生在 Windows 7 Ultimate 中,而不发生在 Windows 7 Professional 中。我需要为每个登录的用户运行我的进程,这就是为什么我认为我不能使用该CreateProcessWithLogonW方法。我现在如何解决这个提升权限问题?
编辑:
有 2 个app.manifest文件,一个在服务项目中,另一个在 win 表单(流程)项目中。我删除这两个文件,建立了msi与WiX和再测试。现在它在每台机器上成功运行,每个登录的用户帐户都会启动该进程。但是,现在造成了一个问题。其实我需要在windows/system文件夹下写一些日志,我现在做不到。我正进入(状态 ”UnauthorizedAccessException" …
背景信息:
我正在构建一个SCADA系统,它运行在VBA上,我寻求C#的一些功能.我在C#中构建了一个DLL库,并获得了在DLL和VBA之间流动的基本数据.
[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class BE_Log
{
public string DateTime
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
public string User
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
public string SCADA
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
public string Tag
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
public string Area1
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
public string Area2
{
[return: MarshalAs(UnmanagedType.BStr)]
get;
[param: MarshalAs(UnmanagedType.BStr)]
set;
}
public string Description
{
[return: MarshalAs(UnmanagedType.BStr)] …Run Code Online (Sandbox Code Playgroud) 我有一个 DLL,导出了以下函数。
extern void Finalize(void (*WriteEntry)(const char* entry));
Run Code Online (Sandbox Code Playgroud)
我正在使用 P-Invoke 从 PowerShell 调用 DLL。
在 PowerShell 脚本中,我定义了一个函数,每当调用函数指针WriteEntry时都需要调用该函数。FinalizeWriteEntry
似乎正确的方法是围绕WriteEntryPowerShell 函数创建一个 C 风格的包装器,其中包装器Finalize作为函数指针传递到其中。
经过一些调查后,我发现可以创建一个可以与非托管代码互操作的委托(请参阅如何将函数指针从 C# 传递到 C++ Dll?)。我创建了以下CallbackDelegate类型。我能够将它从 C# 代码传递到 DLL。现在,我需要一种方法让 PowerShell 应用程序能够构造委托并将其传递给 DLL。
$delegateTypeDefinition = @'
[System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.Cdecl)]
public delegate void CallbackDelegate([System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] string entry);
'@
Run Code Online (Sandbox Code Playgroud)
我不确定如何将 CallbackDelegate 委托包装在WriteEntryPowerShell 函数中。
因此,我认为需要回答的问题是,我们如何从 PowerShell 函数构造委托。如果事实证明这是一个 XY 问题,我希望我已经提供了足够的细节来指出正确的方向。
我正在使用反射器浏览mscorlib中的类型(就像你那样...)并在System.Runtime.InteropServices.Expando命名空间中遇到了IExpando接口.
我在反射器中进行了搜索,甚至检查了MSDN,似乎mscorlib中没有类型实现此接口.MSDN上也没有代码示例.
有人在自己的代码中实现了这个接口吗?
有谁知道它用于什么?
谢谢
我正在编写一个小型应用程序,希望从Chrome浏览器中获取URL。
为了首先检查Chrome浏览器是否打开,我使用以下代码:
IntPtr WindowTitleTextPtr = GetForegroundWindow();
StringBuilder WindowTitleText = new StringBuilder();
GetWindowText(WindowTitleTextPtr, WindowTitleText, 256); // Problem
...
Run Code Online (Sandbox Code Playgroud)
我正在使用GetWindowText()函数获取Windows标题文本,但在那里我遇到了问题。
如果Chrome窗口没有URL,只是一个New Tab,那么我没有问题,WindowTitleText.ToString()等于New Tab-Google Chrome。
但是,如果我打开网页,在这种情况下,URL填充了一些URL,则在 GetWindowText()行中我得到:
vs32host.exe已停止工作消息窗口,要求我执行以下操作:
这是怎么回事?
救命!
我有一个UInt32值,我想使用InterOpServices传递给外部DLL.
非托管代码的原型是:
[DllImport("svr.dll")]
public static extern UInt32 CreateTag (
[MarshalAs(UnmanagedType.LPStr)] String Name,
Object Value,
UInt16 InitialQuality,
bool IsWritable);
Run Code Online (Sandbox Code Playgroud)
调用代码是:
int myValue = Convert.ToInt32(item); //How to marshal as I8 type
tagNumber = (UInt32)svr_DLL.CreateTag(
DeviceName + "." + el.tagName,
myValue, // <-- this argument
192,
Convert.ToBoolean(el.tagEditable));
Run Code Online (Sandbox Code Playgroud)
我想传递给I8类型的对象值"myValue".
如何才能做到这一点?