标签: interopservices

无法加载文件或程序集'System.Runtime.InteropServices.RuntimeInformation

每当我尝试运行具有应用程序洞察力和实体框架的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)

任何帮助将不胜感激

非常感谢

c# azure interopservices azure-application-insights webjob

17
推荐指数
3
解决办法
1万
查看次数

在VB.NET中修改C结构

我正试图在我的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 vb.net dll interopservices

16
推荐指数
0
解决办法
931
查看次数

如何使用 c# 中未注册的 dll?

我有一个需要通过 c# 访问的自定义 dll(未注册)。如何在不注册 DLL 的情况下执行此操作?

编辑:它是一个 C++ dll。

c# dll interop interopservices

5
推荐指数
1
解决办法
2866
查看次数

对于某些版本的 Windows,Windows 服务无法在用户使用 WTSQueryUserToken 登录时启动交互进程

按照此链接,我在我的 C# 解决方案中实现了WTSQueryUserTokenCreateProcessAsUserWrapper.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 表单(流程)项目中。我删除这两个文件,建立了msiWiX和再测试。现在它在每台机器上成功运行,每个登录的用户帐户都会启动该进程。但是,现在造成了一个问题。其实我需要在windows/system文件夹下写一些日志,我现在做不到。我正进入(状态 ”UnauthorizedAccessException" …

c# windows windows-services interopservices

5
推荐指数
1
解决办法
3634
查看次数

来自C#DLL的用户定义对象的VBA数组

背景信息:
我正在构建一个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)

c# vba marshalling interopservices

5
推荐指数
1
解决办法
922
查看次数

从 PowerShell 将函数指针传递到 DLL

问题

我有一个 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 问题,我希望我已经提供了足够的细节来指出正确的方向。

dll powershell delegates interopservices

5
推荐指数
1
解决办法
811
查看次数

什么是IExpando,它在哪里使用?

我正在使用反射器浏览mscorlib中的类型(就像你那样...)并在System.Runtime.InteropServices.Expando命名空间中遇到了IExpando接口.

我在反射器中进行了搜索,甚至检查了MSDN,似乎mscorlib中没有类型实现此接口.MSDN上也没有代码示例.

有人在自己的代码中实现了这个接口吗?

有谁知道它用于什么?

谢谢

.net c# interopservices

4
推荐指数
1
解决办法
1450
查看次数

GetWindowText()函数并非始终正确执行

我正在编写一个小型应用程序,希望从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已停止工作消息窗口,要求我执行以下操作:在此处输入图片说明

这是怎么回事?

救命!

c# vshost32 interopservices .net-4.5 visual-studio-2012

3
推荐指数
1
解决办法
1657
查看次数

如何使用PInvoke作为I8类型进行编组?

我有一个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".

如何才能做到这一点?

c# pinvoke marshalling interopservices

2
推荐指数
1
解决办法
147
查看次数