如何使用Microsoft.Office.Interop.Word?获取Word文档中特定单词的出现次数?
例如,在我的Word文档中,我##<Test Sub Clause1>##在不同的地方有两个标签.我需要在特定文档中记录它的总数.在我的例子中,它将是2.
是否存在任何预定义的函数Microsoft.Office.Interop.Word来获取此计数?或者最简单的方法是什么?
是否可以在C#中完全关闭垃圾收集?我正在调试一些毛茸茸的托管/本机互操作内存错误,我想快速排除GC释放我仍然需要的本机对象的可能性.
我正在尝试为一组非托管 C++ 库创建包装器。我有库的代码,因此我下载了 P/invoke 互操作助手。
我对 C++ 项目中的导出内容有点困惑。它只是项目的标题吗?
这是一个相当大的工程。我是否只需将每个库的标头加载到命令行工具中并生成 C# 签名?
完成此操作后,我是否需要手动将实际的 dll 导入添加到它们中,如下所示,或者是否有一种方法将其定义为一个 DLL?:
[DllImport(MyDLL.dll)]
Run Code Online (Sandbox Code Playgroud) 我一直在寻找这个数小时,但找不到合适的方法来这样做。在 MSDN 上,他们建议使用Address和SubAddress定位演示文稿中的幻灯片,但这没有达到其目的。
所以我的问题是,如何在同一个演示文稿中向幻灯片添加超链接?
我想检索 Windows 10 Pro 64 位中指定进程 ID 的有效 DPI 感知值。我需要的值是我可以使用 WinAPI GetProcessDpiAwareness函数获得的PROCESS_DPI_AWARENESS之一。
为了实现我所需要的,我在 VS 2015 中编写了一个简单的单窗口 C# WPF 应用程序。我将我感兴趣的进程 ID 输入到 TextBox txtProcessID 中,当我按下 txtProcessID 按钮时,结果显示在 TextBlock txtResult 中:
private const int S_OK = 0;
private enum PROCESS_DPI_AWARENESS
{
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
}
[DllImport("Shcore.dll")]
private static extern int GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS value);
private void btnGetDPIAwareness_Click(object sender, RoutedEventArgs e)
{
int procIDint = int.Parse(txtProcessID.Text);
IntPtr procID = new IntPtr(procIDint);
PROCESS_DPI_AWARENESS value; …Run Code Online (Sandbox Code Playgroud) 考虑以下 C 函数:
void AssignPointer(char **p) {
*p = "Test1";
}
char* Return() {
return "Test2";
}
Run Code Online (Sandbox Code Playgroud)
现在考虑以下 Python 代码:
import ctypes
lib = CDLL('LibraryPathHere')
lib.AssignPointer.restype = None
lib.AssignPointer.argtypes = (ctypes.POINTER(ctypes.c_char_p),)
lib.Return.restype = ctypes.c_char_p
lib.Return.argtypes = None
def to_python_string(c_str : ctypes.c_char_p) -> str:
return c_str.value.decode('ascii')
Run Code Online (Sandbox Code Playgroud)
现在进行以下工作:
c_str = ctypes.c_char_p()
lib.AssignPointer(ctypes.byref(c_str))
print(to_python_string(c_str))
Run Code Online (Sandbox Code Playgroud)
然而,以下给出AttributeError: 'bytes' object has no attribute 'value':
c_str = lib.Return()
print(to_python_string(c_str))
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,调试器显示c_str为c_char_p(ADDRESS_HERE)。在第二种情况下,调试器显示c_str为b'Test2'。
这是 Python/ctypes 中的错误还是我做错了什么?
我有 C#(核心)和 C++(非托管 DLL)之间的代码互操作。
在 C# using 中分配的内存Marshal.AllocHGlobal()需要在 C# using中释放Marshal.FreeHGlobal()。
在 C++ using 中分配的内存new需要在 C++ using中释放delete。
由于 GC 不再跟踪这些内存处理程序,我可以随时delete或FreeHGlobal()随心所欲吗?
我收到了一位供应商的消息,说明他们将删除对Interop库的支持,因为:
从.NET 4.0开始,不推荐使用托管代码和本机代码之间基于互操作的通信
它是否正确?如果是这样,那么正确的方法是什么?为什么?我无法理解为什么从Interop管理COM对象是个坏主意.就我记忆中的所有Office产品而言,微软都这样做.
我正在使用 C++ 创建 DLL 并使用 C# 导入它。我编译该 DLL 没有问题,并且从 .NET 4.7.1 调用它时工作正常。但是,当我尝试从 .NET 6.0 调用它时,出现错误EntryPointNotFoundException:
Unhandled exception. System.EntryPointNotFoundException:
Unable to find an entry point named 'E' in DLL 'test.dll'.
at Program.E(int a, int b)
at Program.Main(String[] args) in G:\C++\Test\Program.cs:line 6
Run Code Online (Sandbox Code Playgroud)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--<TargetFramework>net4.7.1</TargetFramework>-->
<TargetFramework>net6.0</TargetFramework>
<OutputType>Exe</OutputType>
<Configuration>Debug</Configuration>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
extern "C"__declspec(dllexport) int E(int a, int b)
{
return x + y;
}
Run Code Online (Sandbox Code Playgroud)
public class Program
{
[DllImport("test.dll")] public static extern int E(int a, int b); …Run Code Online (Sandbox Code Playgroud) 我试图将delphi dll导入我的vb.net项目
这是我的代码:
Private Declare Function AddIntegers Lib "C:\Program Files (x86)\Borland\Delphi6\Projects\first dll\Project2.dll" Alias "AddIntegers" (ByVal a As Integer, ByVal b As Integer) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim ii As Integer = AddIntegers(1, 3)
MsgBox(ii)
End Sub
Run Code Online (Sandbox Code Playgroud)
这是delphi库代码:
library MyFirstLibrary;
uses
SysUtils,
Classes;
{$R *.res}
function AddIntegers(_a, _b: integer): integer; stdcall;
begin
Result := _a + _b;
end;
exports
AddIntegers;
begin
end.
Run Code Online (Sandbox Code Playgroud)
有一个EntryPointNotFoundException:
Unable to find an entry point named 'AddIntegers' …Run Code Online (Sandbox Code Playgroud)